How do i get custom metabox data from each multisite blog?

For those who stumble upon this in the future, this was actually answered by the CMB2 author himself, Michael Beckwith:

$sites = wp_get_sites();
$current_site = get_current_blog_id();

foreach ($sites as $site) {
  $details = get_blog_details($site['blog_id']);
  $zSite = $details->blog_id;
  $mycolor="";
  $mclass="";

    if( $current_site == $zSite ) {
        $mclass="active";
    }

    switch_to_blog( $site[ 'blog_id' ] );
        $mycolor = get_option( 'myprefix_options' ); // here's the updated code
        $mycolor = $mycolor['test_colorpicker']; // here's the updated code
    restore_current_blog();

  printf( '<li role="presentation" class="%s"><a style="border-color:%s" href="%s">%s</a></li>', $mclass , $mycolor , 'http://'.$site['domain'].$site['path'], $details->blogname );
}

According to Michael:

I believe the issue is stemming from the myprefix_admin() function, in the end. It’s creating what’s known as a singleton, which means only one instance of an object will exist at a given time. It’s being run right away, and any time you do a call with myprefix_admin() afterwards will reference that first object. This includes inside foreach loops like what you’re trying to do above.

…what we do is simply fetch the entire option, and then pluck out just the part we need, in this case the color picker value.

Thanks again CMB2’s Michael Beckwith.