Surface is a fairly simple object, basically just a rectangle that can be stretched and bend into some other shape. Some types of surfaces supported in Rhino are PlaneSurface (a literal rectangle with interior), Revolution (one curve swept (partially) in a circle, SumSurface (one curve swept along another curve), and NurbsSurface.
When a surface becomes part of a Brep, it needs additional information and it is wrapped up into a BrepFace. BrepFaces add additional functionality such as trimming edges, some topological stuff, and also a normal-inversion-flag.
The normal direction of a surface is implied by the direction of U and V in any given point. It’s the right-hand-rule; if your index finger points along U, and your middle finger points along V, your thumb is the normal direction. In order to flip the normal direction of a surface, either U or V must be reversed, or U and V must be swapped with each other. This can be difficult depending on the surface type, and always requires the creation of a new surface.
Since faces in a brep often need to be flipped to keep the normal direction consistent across edges, we have a single boolean on BrepFace which allows us to invert the normal of the underlying surface without having to reconstruct the surface itself.
Personally I’d have preferred for this boolean to exist on Surface rather than BrepFace, because in the current system it is very easy to lose that information, and this is causing lots of problems in Grasshopper in particular.