So that actually got me looking in the right area! Thanks Robert.
Here's the solution:
Since I was overwriting XStream and redefining stdout I needed to reset stdout to point to Maya's output, but where is that? Well, the hint was staring me in the face, I just needed to find it; the answer was in plogging.py (pymel's logging system. There's a function called _fixMayaOutput and they use it to reset their own logging system.
So...
import sys
from maya import utils
# redefine sys.stdout
sys.stdout = utils.Output
# in order to use stdout 'write' requires a 'maya.Output' so we flush it
class MayaOutput(sys.stdout):
def flush(*args, **kwargs):
utils.Output = MayaOutput()
sys.stdout = utils.Output
# initialize
log = MayaOutput()
# and flush, we're back to feeding output to the script editor
log.flush()
print("Hello World")
Thanks for your help Robert!