As I have stated previously, and as anyone with a similar background in asynchronous and concurrent programming will reinforce (including the authors of Loom, for example), asynchronicity is orthogonal to concurrency.
One of these concepts refers to a continuation-passing style of programming, in which the results of computations are not returned from functions directly, but rather, are passed to callbacks, which are passed into those functions; while the other refers to the interleaved execution of two or more semantically independent chains of sequential instructions (“threads” / “fibers” / “strands” / etc.).
However, I believe I know why you (and maybe other Scala developers) are so confused: because while asynchronous programming is orthogonal to concurrent programming, the motivation for adopting asynchronous programming was in fact to make concurrency more scalable.
Stated differently, the reason we invented async programming was indeed related to concurrency: we wished to have more scalable concurrency than OS threads allowed. However, the reason for inventing async programming should not be confused with async programming, the concept.
We may do async programming for concurrency-related reasons (scalability), but async programming is a completely orthogonal concept to concurrency, and in a post-Loom era, we no longer need to reach for async in order to obtain scalable concurrency, because the concurrency primitive that Loom gives us (virtual threads) is already as scalable as anything we could emulate using async programming.
In summary, some may be confused that async programming has overlap with concurrent programming because our original motivation for doing async was to increase the scalability of our concurrency: but that does not, and will not ever, mean or imply that asynchronous programming (the concept) means anything other than “programming with callbacks”, which is a completely separate concept from concurrent programming (“programming with threads”).
(The confusion is probably made a lot worse in Scala because Future, many new programmer’s first introduction to either asynchronicity or concurrency, indeed conflates async and concurrent features, with some benefit, obviously, but with the side-effect of tangling these concepts in new developer’s minds.)