Interesting question.
So there is a concept in computer science called 
fusion.
My understanding (I don't have a CS degree) is that when data is subject to fusion, we don't create the intermediary lists as you are talking about. This is why, in Haskell, we have the 
ByteString and 
Text datatypes. Unlike 
String, they (ByteString / Text) are subject to fusion. 
Text is useful when we are dealing with unicode data, while 
ByteString is the correct tool when we are dealing with binary data. 
I hope this is useful.