I don't really see how JS could be less verbose in its concurrency-management side.
result = somePromise() // run while the next promises are resolving
pages = await Promise.map(url, url => crawlUrl(url), {
concurrency: 4
})
allResults = await Promise.all([result, pages])
is some of the simplest concurrency code there is. You can keep chucking in more async logic and it doesn't get much more difficult to understand and doesn't introduce much more code.
If you want verbosity, look at Go's equivalent (wait groups) or, god forbid, any concurrency management in Swift.
The only problem you run into with callbacks imo are event-emitters like streams which you need to actually understand. Though I don't think this is any more trivial in other languages with evented/callback APIs like Java and Rust, I think reasoning about event callbacks is always harder for humans but a useful construct and necessary evil in evented code.