I guess I’d need to see exactly what the philosophy behind the normals was (hopefully, not hand tuned to a particular lighting/camera setup, but based on some general sense of how you want them to behave.) A file, which would let me move a light around and see exactly what your normals were, would probably let me get that sense.
But what it looks like from the picture you’ve shown is that your philosophy is mostly flatten your normals onto two planes. That should be working okay with shapekeys, and I’d suspect the issue is less with the normals and more with the topology. (Look at the wireframe mouth. Now google “3d facial topology” and compare with the images you find.) In other words, I don’t believe those normals would look good even if you weren’t using custom normals.
However, you certainly could be grabbing custom normals after the evaluation of the shapekey. If I’m correct about your philosophy regarding your custom normals, one way to do this would be to data transfer (probably partially) custom normals from a copy of your mesh that had been flattened onto two planes. (One way to make this flattened mesh would be a cast modifier, cube-type.)
That philosophy could also be handled in material nodes as well, probably mixing object space normals with normalize(1,1,0) or (-1, 1, 0) on the basis of side (ie, object coords.x > 0.) Normalize after mixing, convert back to world space.
That’s no armature; an armature would complicate things a bit for the node option (for the data transfer, you’d just data transfer from an armature deformed pair of planes.)