show ALL latest posts with archive.php on example.com/latest

All internal rules must point to index.php. This isn’t your theme’s index.php file, this is the main core WordPress bootstrap file.

Rewrite rules set query vars, query vars get parsed into queries, those queries have template files associated with them depending on type. Internal rewrite rules never point directly to theme files. If you want to modify the template for a query, use a template filter.

So for your example, first we add a query var to distinguish this request from others:

function wpd_query_vars( $vars ){
    $vars[] = 'wpd_template';
    return $vars;
}
add_filter( 'query_vars', 'wpd_query_vars' );

Next we add a rule. We use add_rewrite_rule here. If we’re just adding to and not modifying the array of rules, it’s simpler to use this rather than rewrite_rules_array:

function wpd_add_rewrite(){
    add_rewrite_rule(
        'latest/?$',
        'index.php?post_type=post&wpd_template=true',
        'top'
    );
}
add_action( 'init', 'wpd_add_rewrite' );

Note that we set our custom query var here, so we can detect it in the next step, the template filter. We also set simple post_type=post to get the default latest posts ordered by date.

And last, the filter to force the archive.php file for this request if the wpd_template var is present:

function wpd_home_template( $template ){
    global $wp_query;
    if( isset( $wp_query->query_vars['wpd_template'] ) ){
        return locate_template( 'archive.php', false );
    }
    return $template;
}
add_filter( 'home_template', 'wpd_home_template' );