Hi @jenandesign, first of all, welcome in the plugincafe community.
No worry at all, since it's your first post, but I would like to point you about few rules in order to properly ask questions in this forum for future ones (I've set up this one).
With that's said. Regarding your question. I get it to work (a bit hacky) but it's working.
When C4D render a scene, actually the whole scene is cloned in memory and then it renders this one. (It allow a user to still work on C4D while the other scene is rendering).
So this render scene is read-only, you shouldn't modify at anytime anything in this scene, or you can screw up the render.
Moreover in a shaderData, in order to optimize memory, only relevant information (aka polygon, UV) are copied. So you are losing your UserData.
This means you have to find another way to find your effector.
So the way I find to achieve what you want is to get the document from the object passed to the shader(the rendered document).
Then in this document, I search for an effector called "Plain" (Not the most robust way but it's working).
Then here the final code I put on the python color channel of a sketch and toon
doc = op.GetDocument()
effector = doc.SearchObject("Plain")
if not effector: return c4d.Vector()
eff = c4d.modules.mograph.C4D_Falloff()
if not eff: return c4d.Vector()
# World position currently sampled
value = eff.Sample(wPnt, False)
And the attached scene where a plain effector drives a mograph effector and the sketch and toon shader.
If you have any questions, please let me know!