Come hai notato correttamente, non puoi vedere le righe modificate nel CTE nel SELECT principale . Questo è documentato
:
Quindi dovresti usare RETURNING .
Immagino che il modo più semplice sarebbe non usare una funzione, ma eseguire json_build_object nella query principale e farlo funzionare sui CTE parents e children .