Graham, even better would be if you could try the following combination:
_PyGILState_Fini();
_PyGILState_Init(si, st);
(where si and st are the interpreter state and thread state for the target subinterpreter)
If a new PyGILState_SwitchInterpreter API is going to be able to solve this in 3.4, then I believe those private APIs should be enough to make it possible in *current* versions.
If those private APIs *aren't* enough, then I'm missing something and this isn't going to be as easy as I thought.