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.