It's inherent to TCP's exponential backoff, which means any one connection's throughput follows a sawtooth pattern, pushing to use more capacity, then falling back after lost packets. The gaps between the 'teeth' are suboptimal utilization.
Multiple TCP connections improve things as long as each connection's 'teeth' aren't aligned. Consumer broadband asymmetry makes it worse, because when one direction gets saturated (like an uplink) and loses ACK packets on connections that are primarily downward, the downward side still backs off, even if it wasn't yet close to using downward capacity.
Your example of getting full capacity from a LAN link isn't very instructive for what happens over broadband links. Suppose your NIC supports 100Mbps and every link to your LAN destination has at least that capacity. Your NIC will be the bottleneck; you won't trigger the TCP mechanisms. As soon as your 100Mbps local link hits your 10Mbps cable modem, the TCP congestion control becomes a significant factor.
Multiple TCP connections improve things as long as each connection's 'teeth' aren't aligned. Consumer broadband asymmetry makes it worse, because when one direction gets saturated (like an uplink) and loses ACK packets on connections that are primarily downward, the downward side still backs off, even if it wasn't yet close to using downward capacity.
Your example of getting full capacity from a LAN link isn't very instructive for what happens over broadband links. Suppose your NIC supports 100Mbps and every link to your LAN destination has at least that capacity. Your NIC will be the bottleneck; you won't trigger the TCP mechanisms. As soon as your 100Mbps local link hits your 10Mbps cable modem, the TCP congestion control becomes a significant factor.