It's been a long time and you may well be very beyond this, but I notice you are using Cygnus to build a Windows .EXE. Is it possible the difference between end of lines in *nix and Win may be the culprit? Perhaps if there's no line termination, the output is in a buffer. One way to test this is to use one of the commands that works, e.g.,
m=lineout("stdout", ' ')
and see if it forces "hello world" output.

Me, I have the opposite problem: I note that when I run the prebuilt RexxWrapper on Windows, "say" output actually has TWO carriage returns preceding the linefeed! I can actually see them in a hex editor. Anyone have any thoughts on this?