Why WordPress does not Use Separate Table for Post Types (When Registring)?

It would be a challenge to hunt down a specific moment in time when that particular decision had been made.

My educated guess would be that storing CPT definitions persistently would complicate how they interact with rest of APIs (especially Rewrite and localization).

WP is also relatively conservative with database structure. CPT are relatively young and still evolving API, it would be a mess to try and have database table keep up with all developments of its arguments.