Surfaces with the twosided keyword in their shader simply get their data doubled, so they get rendered twice, once from front and once from back. Here is a visual explanation.
The surfaces are doubled by FinishSurfaces() during model load. This means that if you have a model with a two-sided surface and a skin that switches to a one-sided surface, the surface will still be two-sided (as skin changes do not change the model). Likewise, if the surface is one-sided, but the skin surface is two-sided, the model will stay one-sided. This is tracked as bug #2297.