JSFiddle - React, Tailwind, and code Playground

JavaScript

var arr = [
	{id: 1, idPai: null},
  {id: 2, idPai: null},
  {id: 11, idPai: 1},
  {id: 12, idPai: 1},
  {id: 21, idPai: 2},
  {id: 22, idPai: 2},
  {id: 23, idPai: 2},
  {id: 121, idPai: 12},
  {id: 122, idPai: 12},
  {id: 123, idPai: 12},
  {id: 124, idPai: 12}
];

var resultado = [];

function teste(arrEntrada, arrSaida){
    for (let i = 0; i < arrEntrada.length; i++) {
        let item = arrEntrada[i];
        let obj = {
            id: item.id,
            filhos: []
        };
        let filhos = arr.filter(elemento => elemento.idPai === item.id);
        teste(filhos, obj.filhos);

        arrSaida.push(obj);
    }  
}

teste(arr.filter(elemento => elemento.idPai === null), resultado);
console.log(JSON.stringify(resultado));