The solution wound up being to create a new %Stream.GlobalCharacter Stream, read from the source object stream and write the replaced string to this stream, and finally set it to the Ens.StreamContainer target object.
I still have no idea why creating a new stream works while re-writing the existing stream doesn't. The docs seem to imply it should work and even saving the stream after writing didn't do anything different. In Message Viewer, I can see its creating a new body object, as well. Creating a new Stream object works, so I guess that's fine.
According to the doc, that doesn't seem to be the case, see reference below. Since I'm not reading the stream, it should start at byte 0 then overwrite the existing data. But, since the new data is smaller than the original, I would assume I should have duplicate data at the end. For w/e reason, I don't.
But this is kind of off topic as this isn't really my issue; the data looks correct. I'm trying to figure out why it works on the DTL testing tool, but doesn't while running in the actual Process.
Commonly Used Stream Methods and Properties
"Write() — Append data to the stream, starting at the current position. Overwrites existing data if the position is not set to the end of the stream."
I know this is old and doesn't quite apply to your situation, but you can also get this error if you use the File Name setting: %f. I ran into an issue where the DTL 'copy' function wasn't working so the Ens.StreamContainer's OriginalFilename property wasn't copied and it would give this error because the File Name was blank/null.