To give a high level description,
BeginDataXfer queues up the request i.e. gives the buffer and its location to the USB stack
Waitforxfer waits for the transfer to complete, it'll wait for the timeout value specified if the transfer doesn't complete by then it'll timeout the reqeust
Finishdataxfer retrieves the data that was received. If only part of the data was received and a timeout happened it'll release the rest of the buffer
The limitation in number of BeginDataXfer has to do with the amount of buffer that can be queued on the host controller driver Please look at http://msdn.microsoft.com/en-us/library/ff538112.aspx for details.
The more transfers you queue the faster the data rate i.e. by the time one transfer is complete the next is already queued up so it'll start.
Xferdata uses the above 3 API but there is a performance difference because only after one Xferdata returns we'll queue up the next so there is latency between 2 transfers are the application level.