I could replicate the problem with various shells under FreeBSD, GNU/Linux, and Solaris. It had me head-scratching for more than an hour, so I decided to post the question here
read expects input on a new line
while read a; do echo $a; done foo bar ^D
is more or less what you wanted