A BuddyPress activity item is not a post, and the query is different

The activity stream lives in its own tables with its own query class, so every WordPress instinct about WP_Query, post meta and the loop is wrong here.

$activities = bp_activity_get( array(
    'per_page'    => 20,
    'filter'      => array( 'action' => 'new_blog_post' ),
    'show_hidden' => false,
) );

foreach ( $activities['activities'] as $activity ) {
    echo esc_html( $activity->action );
}

The return value is an array with the items under a key rather than the items themselves, which catches everyone once. Activity is written on hooks from all over the site, so a slow stream is usually a plugin recording something on every page view rather than the query itself. The tables are indexed for retrieval by component and user; filtering by anything else, particularly by activity meta, scales the way postmeta does and for the same reasons.