I haven't played Halflife 2, but i can think of ideas how to make it. First objects are just what they are in every other game. When hit occurs, the game finds out which face(s) were involved on collision and then subdivides the face into more triangles. Depending on what hits the surface i think there must be hard coded behaviours for different cases.

Now.. all objects consists of triangles, so if bullet hits a glass which is rectangle or a cube as a whole, it gets tricky finding out which faces are with the subdivide. They could either have a common group index variable or material variable which stores info on how hard they are to bend/destroy. Either case, it is easy to find out which face it hit and then spread the effect on other same group triangles.