Всего пару строчек кода, которые при желании можно и в одну соединить в ущерб наглядности
const map = Object.assign({} , ...arr.map(v =>
({ [v.id]: Object.assign(v, { children: [] }) })
))
const tree = Object.values(map).filter(v =>
!(v.parent && map[v.parent].children.push(v))
)