The difference is in how easy it is to detect the cause of problems.
Mistakes like wrong function names are mostly easy to find and fix.
Mistakes when using core.async can be very hard to track down.
OP called it "clojure.async." I question how much they've really used it.
I haven't heard complaints about the thread pool before, I thought it just matched your number of cores by default but could be configured. I do know if you do blocking takes (<!!) where you're supposed to do parking takes (<!) the lightweight threads block the entire parent "real" thread and you can get thread exhaustion, maybe it was that?