fix waitall deadlock if any errors occur (#60030)
When errors occur, `waitall` may skip allocating Channel producers,
leading to deadlock in the subsequent loop in the event that the user
asked it to failfast (ironically). This is seen often in the failing of
the threads_exec test ever since the test was added for this call.
Simplify this to just use separate loops for the wait and the return
computation.
(cherry picked from commit e2f3178d9bd94ce452bbf63adceffd71d6b449ce)