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.