Sua solução proposta (em sua edição) não funcionará porque você nunca desiste do encadeamento (para que o retorno de chamada nunca possa ser chamado, para que a variável nunca possa ser definida, para que seu loop nunca seja interrompido). O nó não é multi-thread - há apenas um thread executando javascript a qualquer momento. Não há como produzir esse encadeamento, exceto retornando de qualquer código que esteja sendo executado.
Então, você não pode fazer o que você quer fazer. Você pode tentar usar algumas das soluções que reescrevem seu código de sincronização em assíncrono nos bastidores, mas eu pessoalmente descobri que essa abordagem não vale o esforço - é melhor apenas morder a bala e apenas fazer tudo com retornos de chamada (com o tempo a dor diminui :).