Disposing the pictures is not itself laggy; the lag is likely generated by repeatedly retrieiving the bitmap from the picture file (CPU memory). Because it takes so much time to load graphics that way, the Cache module ordinarily stores them in RAM for quick retrieval.
I assume that the iconset and characters aren't disposed because it makes sense to keep that in memory. After all, icons are used frequently enough that retrieving the huge IconSet graphic from CPU memory all the time would cause lag. Similarly, the character bitmap has to be kept in RAM in order to animate the sprites. The decision not to dispose after drawing it in a window was probably based on the assumption that any characters being drawn in a window are also likely contained in a sprite as well. You wouldn't want a situation where you drew a character on a window in Scene_Map, only to then have that bitmap disposed and have every sprite using that characterset on the map disappear.
Facesets, on the other hand, are typically large files and they are used very infrequently. By default, they are only drawn in the menu and in message windows, and in each circumstances there is not much of a penalty in loading from the CPU (at most, there would only be a little bit of lag when first loading the menu, and the message window is refreshed infrequently enough that it likely makes little difference. As such, the speed increase from storing the pictures in RAM is negligible (by default), and so the programmers likely decided that it wasn't worth the space. That's likely why they chose to dispose facesets, but not the other graphics you mention.
If you're writing a script where it makes sense to use RAM to store the pictures however, and it sounds like you are, then by all means create a method which does not dispose the faceset. Given their size, however, you should eventually dispose them once it is no longer worthwhile to keep them in RAM (for instance, when you exit the scene).