Async can handle a lot more requests than using a threaded model, each thread has an overhead of several megs of RAM. In Java, if I remember correctly, it's around 2MB per thread you start, so for each user accessing your site, you create a thread for the user, a thread for this a thread for that and soon you chow up all the available memory.
Using the asynchronous model, you have one thread that is shared between many users and by using it in a non-blocking way, you can do a lot of processing with that single thread - NodeJS uses a single thread for its event loop. Java, in frameworks like VertX and the latest servlets, Scala with Actors, Dart using Isolates and its own event loop decided to take it a step further, start a number of threads and let each of them have an event loop - this means each event loop can potentially max out a CPU core.
To get the same benefits in NodeJS, you'd need to start multiple NodeJS instances, usually one per core. I'm not an Erlang expert, but I believe Erlang-based frameworks are doing the same as NodeJS on a Single Thread.
As Tibor said, Async is the way forward! Ain't nobody got time for blocking IO.