Thanks! Works like a charm!
I realized that async will only work if the chain of binds is not interrupted.
For my case, using your trick but with a delay of 0ns works great.
after (Core.Time_float.Span.of_ns 0.)
>>= fun () -> loop (count + 1)