lo que pasa es que dentro del ciclo tienes que leer otravez el archivo si no, la variable se queda con el primer y unico registro que leiste y el puntero del archivo se queda al principio tambien, prueba con esto:
procedure imprimirarchivo(var arch   : tarch);
var
rarch:trarch;
begin
 clrscr;
 while not eof(arch) do
       begin
         read(arch,rarch)
         writeln(rarch.campo1,' ',rarch.campo2);
       end;
 writeln('Fin de Archivo');
end;