In order to control the shading for a proper cel-shaded look, custom normals are what we use to solve that issue. To begin with, it is important to have clean topology on the face for this example.
During the retopo stage, it is important to place these nice edge loops that mask off the front region of the face.
First, duplicate the original face and move it over to the side somewhere. Select all of the polygons that represent the front of the face and scale them in one direction until they are almost flat. Use soft-selection if you want to avoid clipping in delicate areas (interior of eye/mouth cavity)
Depending on the type of cel shading, you can push the face out a bit and rotate it slightly so that it faces upwards. This allows the face to be fully lit even if the light is directly facing down. Otherwise a downwards facing light would cause self shadowing on the face.
Select the edited mesh and then the target face. In the Mesh tab select “Transfer Attributes”.
In this specific case, only “vertex normal” are needed and sample space set to “topology” since we used a duplicate mesh. The method still works if you used a proxy geometry for the normal editing but results may vary.
Once applied, the normals from the edited mesh will link with the target mesh. Delete history to make the change permanent.
In this example, the lighting on the flat face corresponds to the shading on the target face. The original face has shading that would look poor on a cel shader.
The same technique can applied on the hair as well.
In the Transfer Attributes, world space sampling is applied. World Space sampling needs history deleted in order to store the result, otherwise when moving the projected mesh, the normals will change.