I'm creating a parent theme and several child themes. But how can I prevent the parent theme from ever being used?
Not using the current system. In order to serve as a valid Template for a Child Theme, the Parent Theme must exist, and be a valid Theme. That's because the Parent Theme's template files must be accessible via
locate_template(), in order for the Child-Parent fallback to work properly.
Note: if this core Trac ticket is implemented, then you'll be able to filter
locate_template(), which would conceivably enable you to put your Parent Theme in a separate location, not accessible by
Dashboard -> Appearance -> Themes.
You can't hide the theme itself, but you can control access to the theme switcher: