No it still comes from the thread pool, and it does not defeat any purpose.
Async comes becomes valuable during blocking operations, like accessing the disk or network, anything that is not cpu-bound (i.e., operations that are I/O (Input/Output) bound).
The thread is returned to the pool only so that it doesn't have to wait for the blocking operation to complete before it can help service another HTTP request.
Once the blocking operation is complete, another worker thread is grabbed from the pool.
This can help to counteract something called thread pool starvation. Each thread pool only spins up so many threads, and spinning up more is expensive. Sometimes it is the case that a web server can be tied up with many threads waiting for blocking operations to complete, so new requests have to wait for a new thread, meaning they have to wait for someone else's blocking operation. With async, a thread that is waiting on a blocking operation can be returned to the pool so that it can service other (possibly CPU-bound) requests.
Read this: http://msdn.microsoft.com/en-us/library/ee728598(VS.100).aspx
...and then read this: http://blog.stephencleary.com/2013/11/there-is-no-thread.html
I understand that another thread is grabbed from the pool once the
blocking operation is done, but what I don't know is exactly what
thread executes the blocking operation itself.
No thread executes the blocking operation. The CPU is waiting on another device -- like the network card, or the disk controller, to return output.
Threads are CPU-bound artifacts, as is RAM, since it operates over a buss according to the CPU clock rate. There are other devices in the machine like USB, network card, disks, etc. These other devices are I/O bound because they are input/output devices.