tl; dr knex - инструмент слишком низкого уровня для того, что вы пытаетесь сделать, вы должны использовать ORM для такого рода задач
Однако вы можете сделать это с большим количеством ручной работы.
Сначала необходимо выполнить запрос с правильными объединениями и создать псевдонимы с префиксами таблиц для каждого столбца таблицы, чтобы иметь возможность получать данные результатов в формате, в котором все данные представлены в виде плоского массива, например:
knex('table1' as t1)
.join('table2 as t2', 't2.t1_id', 't1.id')
.select(
't1.id as t1_id',
't1.other_column as t1_other_column',
't2.id as t2_id', <more columns you want to extract>)
Результаты примерно такие же, как
[ { t1_id: 1, t1_other_column: 'foo', t2_id: 4}, ... more rows with flat data... }]
Затем вам нужно написать код JavaScript для реструктуризации плоских данных во вложенные объекты.
Но вам не следует выполнять такую работу вручную.Все ORM на основе knex уже внедрили общие решения для простого написания запросов такого типа.