Error 404 on pagination on homepage

To understand why 404 erros occur with pagination, you have to first understand the process WordPress follows when a page is requested.

The query is parsed and the results are queried from the database before the template is loaded. When you create a new query in the template, these results are unrelated to the original query. Whether or not there are additional pages, and how many pages exists, is based on the original default main query, WordPress has no “awareness” of your new custom query in the template.

So the way to fix this is to modify that original query before it is sent to the database via the pre_get_posts action rather than calling query_posts in the template.

function wpa89392_homepage_products( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'post_type', array( 'product' ) );
    }
}
add_action( 'pre_get_posts', 'wpa89392_homepage_products' );