Okay, you get a full answer :)

We're making a backup copy of our original positions in a new vector-type attribute. Then we're rotating our regular geometry, by first translating our center of rotation to 0,0,0, then rotating, then translating by the inverse of our original rotation. That's the basic technique for rotating or scaling about any arbitrary position.
We've rotated our geometry successfully, but we want to limit it by vertex group. So we find the difference between our new position and our old position, multiply that difference by the inverse of our vertex group, and add it back in. We're interpolating between our original position and our new position on the basis of our vertex group.
This is like rotating an armature without volume preservation, by the way. Because we're interpolating linearly between two positions, 0.33 weight at 90 degrees rotation doesn't actually mean 30 degrees rotation, and there can be some volume loss. Volume preservation would add considerably to the complexity, and I can't think of a single out-of-the-box modifier that doesn't act this way; even a VG limited armature mod with volume preservation causes this kind of behavior, it's only the bones' VGs that preserve volume, not the modifier's VG.
This would probably be easiest to use by dividing it up into two different node groups: a rotate about group, and an interpolate attribute group. Because geometry needs to be calculated serially, it's probably necessary to backup your position outside of those groups.
To answer your reasons for wanting this, I'm sorry that you waited for geometry nodes, because a single bone armature or a warp modifier (with no falloff) can do any arbitrary transformation, limited by vertex groups. Either is probably a better solution, because they're simpler to set up, more optimized, and easier to control.