A tubulação faz. Você pode verificar por si mesmo, por exemplo, imprimindo $BASHPID
dentro e fora do loop while ou fazendo algo como:
ls | while read file; do
sleep 100;
done
, parando com C-Z
e verificando ps
ou ps --forest
depois para ver a árvore de processos em sua sessão de terminal.
Você pode evitar o subshell "piping" de maneira um pouco diferente:
var=0
while read file
do
echo $file; var=1
done < <(ls -1 /tmp/)
echo $var #=> 1