1. В админке за вывод таких вещей отвечают inputRenderer и ExtJS. Просто так у вас во фронте ничто работать не будет. 2.
&items=`[[*category]]`
А с чего вы взяли, что у вас поле документа должно в себе нести выборку по вашему запросу? Оно несет конечное установленное значение, но никак не выборку данных по запросу. 3. Вот поэтому мы Смарти и юзаем, чтобы не заморачиваться с такими простыми задачами. Один из вариантов:
<select id="profile"> {foreach $modx->getIterator('modResource', ['parent' => 18]) as $doc} <option value="{$doc->id}">{$doc->pagetitle}</option> {/foreach} </select>
4. Если вы совсем по религии хотите сделать (чтобы не было двух отдельных запросов в админке и фронте), то правильней делать так: создавать сниппет, в котором будет выполняться формирование запроса и набивка полученных данных. В нем надо будет рулить по условию тип вывода — для ТВшки все данные должны быть вида Заголовок1==id_1||Заголовок2==id_1....., а для фрона как раз своим способом и набивайте HTML. Или возвращайте JSON-строку и если используете Смарти, то там выполняйте JSON-декодинг и набивайте конечный HTML. А в ТВшке в качестве возможных значений указывайте @CHUNK, в котором будет вызываться этот сниппет (к сожалению нельзя сразу указать сниппет, ТВшки этого не умеют, хотя можно еще использовать @EVAL return $modx->runSnippet(...))