I'm just an average web developer, so I could be wrong here, but that's not my understanding of it.
Your application has n threads to begin with, if you use async, these will be utilized to schedule tasks.
You're basically trusting your language to properly pause and restart the procedures.
If you spawn new threads, these will be managed by your kernel. If that kernel is Linux, that it already has a pretty good algorithm to pause and restart them, so you're not really wasting a lot of resources.
So I believe there are effectively two differences: threads can scale up to the limit of your os/kernel and hardware. Async can scale up to the level of the threads your language spawns to handle these tasks.
Threads trust the kernel/OS to prioritize workloads, async trusts the language