The basic issue is latency. With TCP each time the remote server sends a packet, your local connection has to respond with an ACK to acknowledge receipt of the packet. Until that ACK is received, the packet has to be kept in a buffer of limited size so it can be re-sent. Due to latency, ie. the time taken for a packet to be sent to you and the ACK returned, those buffers get full and the TCP stack stops sending new packets. This is a way oversimplified explanation, but basically, that effectively throttles the throughput.
Modern TCP stacks try to auto tune the buffer size to get round this issue, but the auto tuning works in steps. So on a typical speedtest to an international destination, you'll see that the speed is steadily increasing all the way through the test. So if the test went on longer, the speed would eventually ramp up to full line speed.
However, the above applies only to a single connection. If you are using a torrent and enough seeds are available, due to it's use of multiple connections, the torrent should get close to line speed. But for that to happen, the file has to also be big enough for the speed to ramp up.