В общем, я пробовал по всякому. Ничего нормального

В общем, я пробовал по всякому. Ничего нормального тут не получается. Но поделюсь одним нестабильным элементом:

Весь главный шаблон оборачиваем в блок, к примеру resource. Далее создаем новый промежуточный layout-wraper.tpl с таким содержимым:

{extends "layout.tpl"}
{block name="resource"}
    {if $is_ajax}
        {block name=content}
            {$smarty.block.parent}
        {/block}
    {else}
        {$smarty.block.parent}
    {/if}
{/block}

Здесь важно, чтобы блока content не было в главном layout-шаблоне. Вот тогда при вызове какого-либо более глубокого расширяемого шаблона по условию выводился только блок content.

Но у меня это было очень не стабильно. Это скорее бага, чем фича. Если захочешь с этим поэкспериментировать, то до конечного шаблона создай еще один расширяющий шаблон, в котором будет только расширение прописано {extends ...} и все.

Мне сейчас совсем некогда ковырять глубоко Смарти, чтобы объяснить такое странное его поведение. Коммент оставляю, чтобы возможно на досуге вернуться к изучению этого интересного явления.