After contacting Progress Support I got a version that works, mostly by bypassing the built in functions in Progress altogether.
FUNCTION SetClipboardText RETURNS LOGICAL (cText AS LONGCHAR):
DEFINE VARIABLE iRet AS INT64 NO-UNDO INIT 0.
DEFINE VARIABLE mRet AS MEMPTR NO-UNDO.
DEFINE VARIABLE lRet AS LOGICAL NO-UNDO INIT FALSE.
DEFINE VARIABLE iHnd AS INT64 NO-UNDO INIT 0.
DEFINE VARIABLE iPtr AS INT64 NO-UNDO INIT 0.
/* Open the clipboard for processing */
RUN OpenClipboard(0, OUTPUT iRet).
IF iRet <> 0 THEN
DO:
/* Tell the clipboard to clear itself */
RUN EmptyClipboard(OUTPUT iRet) NO-ERROR.
/* Globally allocate memory for the clipboard data */
RUN GlobalAlloc(2, LENGTH(cText,'RAW') + 1, OUTPUT iHnd).
RUN GlobalLock(iHnd, OUTPUT iPtr).
/* Assign the global memory to the memory pointer */
SET-POINTER-VALUE(mRet) = iPtr.
/* Copy the supplied value to the global memory region */
PUT-STRING(mRet,1) = cText.
/* Unlock the memory so that clipboard can read it */
RUN GlobalUnlock(iHnd, OUTPUT iPtr).
/* Tell the clipboard to copy the data */
RUN SetClipboardData(1, iHnd, OUTPUT iRet).
IF iRet <> 0 THEN lRet = TRUE.
/* Close the clipboard */
RUN CloseClipboard(OUTPUT iRet) NO-ERROR.
/* Free the memory once the clipboard is closed */
IF iHnd <> 0 THEN
RUN GlobalFree(iHnd, OUTPUT iRet).
END.
RETURN lRet.
END FUNCTION.