Да, указать переменную шаблона действительно можно

Да, указать переменную шаблона действительно можно, просто из прошлого коммента подумалось типа {if}{extends ...}{else}..{/if}. Такое там не канает. А с переменной получается следующее:

  1. В __construct лезть не обязательно, у нас же за все отвечает единый контроллер base.php. Прописываем в нем условие:
<?>
// .................................. 
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
    $modx->setOption('layout', 'ajax-layout.tpl');
    $compile_id = 'ajax';
}
else{
    $modx->setOption('layout', 'layout.tpl');
    $compile_id = 'layout';
}

return $modx->smarty->fetch("tpl/{$tpl}", '', $compile_id);

Обязательно задаем разные $compile_id, иначе не будет перекомпиливаться уже отработанный шаблон.

  1. Создаем ajax-layout.tpl. В нем пишем:
{block name=content}
    {$modx->resource->content}
{/block}
  1. Создаем промежуточный switch-layout.tpl, с содержимым:
{extends $modx->getOption('layout', null, 'layout.tpl')}

Здесь один минус есть: в рабочем режиме у шаблонов переменная phptemplates.non-cached == false, и Smarty-шаблоны при повторном заходе не отрабатываются. Так что придется некеширование выставлять в true, что конечно же скажется на производительности. Можно конечно в настройках modxSmarty включить кеширование самих смарти-шаблонов, но это усложняет разработку, ибо надо будет более четко продумывать где что кешировать/не кешировать, и прописывать где надо nocache. Но если это правильно использовать, то нагрузка не должна увеличиться так, чтобы заметно было.

P.S. За полезный коммент поднимаю права до члена Клуба :)