Всё достаточно просто...
Когда значение картинки есть, то оно присутствует в массиве самого объекта, который Вы перебираете. У Вас не получалось его не выводить, т.к. Вы обращались к объекту не как к массиву, а как к protected свойству объекта (из-за двойного подчёркивания __image), а оно в любом случае будет объектом изображения (\RS\Orm\Type\Image), т.к. оно в классе самого ORM объекта определено как объект картинки. Но если вы обращаетесь к ORM объекту как к массиву, то он либо даёт значение картинки(название файла), либо возвращает false.
Т.е. Вам достаточно проверить как:
{foreach $sub_dirs as $item} {* Перебор директорий *}
{if $item.image}{* Если картинка cуществует *}
<img src="{$item->__image->getUrl(310, 310, 'xy')}" /> {* Получаем картинку через объект *}
<a href="{urlmake category=$item._alias p=null f=null bfilter=null}">{$item.name}</a>
{else}
{* Если картинка не существует *}
{/if}
{/foreach}