As respostas SQL são tabelas planas por natureza, portanto, além do knex, você precisará de uma biblioteca externa que possa reconstruir informações planas para objetos aninhados.
A maioria das bibliotecas ORM sabe como fazer isso. Por exemplo objection.js que é construído em cima do knex usa
.eager()
para buscar relações aninhadas. Com o ORM da object.js, a consulta ficaria assim Project.query().where('id', 1).eager('employees')