You want to copy files one by one, but with all I/O done asynchronously.
Meaning that the app would issue several read requests at once and the OS will complete them as it can and signal the app that a block is ready. The app will then issue a write request and, again, the OS will complete it on its own schedule and notify the app when it's done. In practice this will mean that the app will have several outstanding read requests and several outstanding write requests at any time.
Secondly, what matters is the size of read/write requests. Recent Windows versions (starting with Vista) it is faster to read data in smaller blocks and it is faster to write it in larger blocks. On the flip side, reading from a network location is faster with larger blocks.
This is how Windows own robocopy
works and it's pretty damn good.
--
As a bonus - when copying lots and lots of small files, the copying process ends up spending a disproportionately long time opening and closing files. So what you want is an app that looks ahead of its copying queue and pre-opens files in advance. This really kicks the copying to another level in terms of speed.