The data store is where custom tables become possible

Products have always been posts, which is why a catalogue of any size ends up fighting wp_postmeta. The CRUD layer puts a data store between the object and its storage, and the store is replaceable.

add_filter( 'woocommerce_data_stores', function ( $stores ) {
    $stores['product'] = 'Shop_Product_Table_Store';
    return $stores;
} );

class Shop_Product_Table_Store extends WC_Product_Data_Store_CPT
{
    public function read( &$product ) { /* from your own table */ }
}

Nothing in the plugin or in a template needs to know, because everything now goes through wc_get_product(). That is the prize, and it is a prize for later — the interfaces are new and the CPT store is the only complete implementation this year. What it changes today is that the door exists, which it did not in 2.6.