If anyone is interested…
I’m not sure if the following change fixed it or it resolved itself somewhere else in my code, but this has been working for all of my tests so far.
if( ! function_exists( 'cs_close_blocks' ) ) :
function cs_close_blocks( $post_id ) {
$the_post = get_post( $post_id );
if( is_wp_error( $the_post ) ) return false;
// if there are blocks
if ( has_blocks( $the_post->post_content ) ) :
// Update
$the_post->post_content = str_replace('"mode": "edit"','"mode": "preview"', $the_post->post_content); // <= exactly as ACF writes it
// Save it
wp_update_post( $the_post );
endif;
return true;
}
endif;