Bueno por fin entendí, cual es el problema.
Sucede que la rutina Writeln o Write, hace uso de la función WriteFile de la api de windows.
Esta función tiene un parametro lpNumberOfBytesWritten, que devuelve los bytes enviados a consola o un archivo que se escribieron satisfactoriamente.
Freepascal hace uso de ese parametro comprobando el valor devuelto, si este devuelve un valor igual a cero significa que algo estuvo mal.
La funcion Writefile tiene un fallo, sucede que cuando se usa en consola con Unicode(65001), no devuelve los bytes escritos en consola pero los escribe y eso hace que salte el error en pascal.
La solución es usar directamente esta función de la api de windows, si es que sólo quieren escribir o enviar salidas a consola en unicode (utf8), sólo en Windows.
Nota: esto es asi, si el código fuente se escribe en utf8.
Uses Windows;
Var Arch:Word;
BB:longWord;
cad:string;
Begin
Arch:=GetStdHandle(STD_OUTPUT_HANDLE); //Se obtiene manejador
cad:='camión'+#$0D+#$0A; //Se añade Saltos de línea
WriteFile(Arch,cad[1],length(cad),BB,nil);
Writeln('BB = ',BB)
End.
usando clases TStream tambien sería de este modo :
uses classes,windows;
var s: string;
OutputStream: TStream;
Begin
OutputStream := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
s:='camión';
OutputStream.write(s[1],Length(s));
OutputStream.free;
End.
No se realmente si sea la solución perfecta o idonea, pero si a alguien se le ocurre algo mejor. La ayuda no vendría mal.