A file descriptor can really only point to one file at a time. Every invocation of read you have there reads from standard input, including the one in the middle. If you want to read from something else, you have to tell read to use another file descriptor.
exec 5< file1 # assign file1 to the file descriptor number 5.
# ("open for reading" as it were)
while read <&5 a; do # read from fd5
echo before
read var # read from fd0
echo after
done
exec 5<&- # Reset fd 5 ("close the file" as it were)
You can also use read -u 5 to read from a specific descriptor in bash.
readinside the loop to read from? The termimnal (even if I/O is redirected from a pipe or file)? From the standard input of the main script? @kojiro has given you a decent answer.