Using a mouth as an example. Can be applied to other facial features like eye sockets etc.
This linked duplicate will be referenced in modifiers used on the mouth mesh (like Shrinkwrap and Data Transfer) to pull information from the head without creating a dependency loop and breaking the modifier
(Proxy Head should be at the same position as the original head. Image is just for visualization.)
<aside> ⚠️
Make sure both Head and Proxy Head share the same modifiers that alter the mesh. This applies to things like Armature and Subdivision. This way the proxy will follow your rig (since vertex groups are synchronized) and will have the same smoothness as the original head.
</aside>
Add Vertex Groups to the Mouth (names are arbitrary). Each one fulfilling one purpose in the modifier stack:
shrink_outside will be used for a Shrinkwrap using the Outside mode. Allowing the mesh to move away from the head but not inside it. This should be applied to the outer part of the mouth, not the inner area.
shrink_above will be used for a Shrinkwrap using the Above Surface Mode. This will snap the mesh to the head completely and makes sure it’s displayed above the mesh. This should be applied to the Rim of the outer mouth area. With a smooth falloff to the middle to allow the mouth to still move away from the head for specific expressions.
cutter will be used to determine the cutout of the head, using the GN modifier to create a visible hole in the mesh. It should be applied to one loop of the mouth that best represents the opening.
data_transfer will be used to mask out the area of the mouth that should get the same normal data of the head. This way a seamless transition between the two objects is possible. Like with shrink_outside this should be applied to the outer part of the mouth.
These are the essential settings to make the setup work: