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;