pre render script behaviour
The 3ds Max script must be using a copy of the data, if the data sent to the renderer is editable, but still independant of the scene.

There are a couple of other workaround I can think of.


Make a copy of the scene. Then use your python script on the copy and render it. You can delete the copy on render_post or just overwrite the scene everytime you start rendering. This will need a little bit more RAM, but no graphical memory if executed in background mode.
The above solution can be improved by making a linked copy (LINK_OBJECTS). It will not take up much more memory, since the data blocks the same. Then (on the copy) make the datablocks you want to change single users and change them.
Build an operator with UNDO activated and register it. Then, in your python script, call the operator (which does the changes), render the scene, then undo it. Depending on your scene, this may not be faster than a full copy, but will consume less RAM (I think).
Execute your python script from another empty Blender file. Append the scene (which you want to render). Make the changes, and render it, then delete it. Repeat. This is similiar to your setup, but could use the same background blender instance.
The above solution can be improved, by only removing and then appending objects which are changed by the python script.