Ao fazer debug de async/await em TypeScript, o stack trace é seu melhor amigo - mas você precisa saber lê-lo direito. Se uma Promise fica pendurada sem resolver, primeiro checa se você não esqueceu de `await` em algum lugar. Isso acontece mais frequentemente do que se pensa: você chama uma função async, mas não espera pelo resultado. Também com `.map()` ou `.forEach()` costuma dar ruim, porque os callbacks são async, mas o próprio map não espera. Aqui ajuda usar `Promise.all()` ou `for...of` em vez de métodos de array.
Outro ponto importante: dá uma olhada na sua estratégia de tratamento de erros. Se você só tem try-catch e a mensagem de erro ainda parece criptografada, faça log do objeto de erro completo, não só da mensagem. `console.log(error)` em vez de `console.log(error.message)` geralmente mostra muito mais contexto. E bem importante - em Node.js tem Promise Rejections não tratadas que simplesmente morrem em background. Ativa o listener-event `process.on('unhandledRejection', ...)` para debugar, aí você vê onde as promises realmente falham.
Uma dica prática: usa o próprio TypeScript como ferramenta de debug. Se suas type annotations estão corretas, o compilador TypeScript já vai te avisar se você esqueceu de awaitar - você recebe erros de tipo em vez de surpresas em runtime. Isso economiza seu tempo de debug.