Oi Henrique, tudo bem? Estou bem confuso sobre como o projeto foi arquitetado, você adicionar esse script wait-for-it.sh, mas ele não veio com o projeto e há várias referências absolutas que dizem respeito ao seu sistema operacional e usuário, o que torna tudo mais difícil de entender do meu lado.
Aqui, do jeito que está, não vai funcionar. Aqui precisei ajustar algumas coisas e no fim das contas, o que descobri é que na sua aplicação você usa o environment para pegar a URL correta para fazer a requisição. O que está 100% correto.
O problema é que o endereço configurado no environment é localhost:8080, ou seja, depois do Angular ser carregado pelo NGINX, ele vai fazer requisições sempre para o mesmo endereço configurado no código.
Esse deve ser o problema.
Outro ponto que observei é que o location também vai redirect para o localhost:8080.
Então o que tá acontecendo é: você faz requisição para o localhost:8080 (direto no código), essa requisição nem chega a passar pelo NGINX, indo direto para o node1.
E quando você faz requisição para o NGINX, pela porta 4200, você faz um redirect com o location para o localhost:8080, que ao meu ver, também chama o node1.
No fundo, o problema não é do compose, mas sim de arquitetura e configuração mesmo. No fim, não acho que o NGINX deveria informa a porta do redirect, o código do environment não deveria apontar para um node específico e pessoalmente, se fosse para usar o NGINX como load balancer, eu não colocaria os assets lá, por que o assets são gerados por um build próprio.