Apart from obvious cache aspect mentioned in above answers, Linux handles USB storage devices differently than local ones.
When you transfer data to "classic" disk (attached internally via SATA or externally via eSATA), Linux kernel uses DMA mode, which means that the whole transfer is done directly from RAM to disk controller, not involving CPU.
That's why SATA/eSATA transfers are fast.
However when you attach the same disk via USB, then each kilobyte of data is split to 64-byte packets that are exchanged between your computer and USB controller in your USB disk case. This has to be done using CPU, so not in DMA mode.
That's why USB is slower.
What you should also realize is that Linux is caching data in many aspects (not only disk/filesystem related) and on many layers. There are over 100 different caches.
So the bigger file you try to send to USB disk, the more caches are filled during the process. This is exactly the cause on non-linear slowing down of the transfers.