So you asked: "Why does asynchronous behavior reduce the amount of threads?" -
Note: Don't confuse threading with using multicore, Its totally deferent concept , But of course thread can take advantage of multicore system, But now Lets think we have a single core CPU.
Threading
A thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, (Basically small unit of execution).
For I/O operation (like making a network call) take time but program need to wait and
wasting valuable computation power by doing nothing, So historically we use thread that execute a task independently,
Its has some drawback, One of is memory concussion (Because Its need to clone register, stack, counter), this is a deferent topic. Also thread are so expensive to switch context...
So we know that thread are expensive, What if we can reduce thread count ?
Asynchronous
The idea is to use Event, and execute via a library ( Also known: runtime, executor etc...), without the program blocking to wait for results.
Its cheep and efficient for I/O intensive tasks. Even, It can use a single thread to do all async stuff!