Пока не было возможности развивать вопрос, остановился пока на таком доработанном варианте модуля Terminal (от Ильи Ермакова):
## Код:
```
MODULE Terminal_mod;
(**

   Console input / output
   (useful for low-level debugging)
   Contributers: Roman M.
   Author: Ilya Ermakov

**)

   IMPORT WinApi, S := SYSTEM;
   
   CONST
      ln = 0DX + 0AX; (* CR/LF *)
      
   VAR
      in, out: WinApi.HANDLE;
      res, n: INTEGER;
      buf: ARRAY 1024 OF SHORTCHAR;
      cs: WinApi.CRITICAL_SECTION;

   PROCEDURE InitAtomic*;
   BEGIN
      WinApi.InitializeCriticalSection(cs);
   END InitAtomic;

   PROCEDURE BeginAtomic* ;
   BEGIN
      WinApi.EnterCriticalSection(cs)
   END BeginAtomic;
   
   PROCEDURE EndAtomic* ;
   BEGIN
      WinApi.LeaveCriticalSection(cs)
   END EndAtomic;
   
   PROCEDURE AllocConsole;
      VAR res: INTEGER;
   BEGIN
      res := WinApi.AllocConsole();
      res := WinApi.SetConsoleCP(1251)
   END AllocConsole;
   
   PROCEDURE FreeConsole*;
      VAR res: INTEGER;
   BEGIN
      res := WinApi.FreeConsole();
   END FreeConsole;
   
   PROCEDURE OpenStdOut;
   BEGIN
      AllocConsole;
      out := WinApi.CreateFile("CONOUT$", WinApi.GENERIC_READ + WinApi.GENERIC_WRITE, {}, NIL,
         WinApi.OPEN_EXISTING, {}, 0);
      res := WinApi.GetLastError()
   END OpenStdOut;
   
   PROCEDURE OpenStdIn;
   BEGIN
      AllocConsole;
      in := WinApi.CreateFile("CONIN$", WinApi.GENERIC_READ + WinApi.GENERIC_WRITE, {}, NIL,
         WinApi.OPEN_EXISTING, {}, 0)
   END OpenStdIn;
   
   PROCEDURE AssignOutput* (IN file: ARRAY OF CHAR);
      VAR res: INTEGER;
   BEGIN
      IF file # "" THEN
         out := WinApi.CreateFileW(file, WinApi.GENERIC_WRITE, WinApi.FILE_SHARE_READ +
            WinApi.FILE_SHARE_WRITE, NIL, WinApi.CREATE_ALWAYS, {}, 0);
(*         res := WinApi.SetFilePointer(out, 0, NIL, WinApi.FILE_END) *)
      ELSE
         OpenStdOut
      END
   END AssignOutput;

   PROCEDURE String* (IN s: ARRAY OF SHORTCHAR);
   BEGIN
      res := WinApi.WriteFile(out, S.ADR(s), LEN(s$), n, NIL)
   END String;
   
   PROCEDURE Char* (c: SHORTCHAR);
   BEGIN
      res := WinApi.WriteFile(out, S.ADR(c), 1, n, NIL)
   END Char;
   
   PROCEDURE Ln* ;
   BEGIN
      res := WinApi.WriteFile(out, S.ADR(ln), LEN(ln), n, NIL)
   END Ln;
   
   PROCEDURE ReadString* (OUT s: ARRAY OF SHORTCHAR);
   BEGIN
      res := WinApi.ReadFile(in, S.ADR(buf), LEN(buf), n, NIL);
      s := buf$
   END ReadString;
   
   PROCEDURE ReadLn* ;
      VAR s: ARRAY 16 OF SHORTCHAR;
   BEGIN
      ReadString(s)
   END ReadLn;

BEGIN
   InitAtomic;
   IF out = 0 THEN
      OpenStdOut
   END;
   OpenStdIn;
END Terminal_mod.
```


## Код:
```
MODULE Con_test;
(* тестовый модуль *)

IMPORT Term := Terminal_mod;

PROCEDURE Start*;
BEGIN
   Term.BeginAtomic;
   Term.String("Hello!"); Term.Ln;
   Term.EndAtomic;
   Term.FreeConsole
END Start;

END Con_test.
```

^QCon_test.Start
Проверял несколько раз, при повторных запусках консоль уже не появляется.
Пока оставил идею в сторону.
Модуль Terminal/Con определённо нужен для "обратной совместимости" с программами на Object Pascal.