Thanks to the comment by Sally CJ, it turned out that the issue was that the user was not authenticated when invoking admin-post.php via `wp_remote_post`. The simplest solution was to ensure that the wp_remote_post had all the current cookies, as follows:
```
$nonce = wp_create_nonce( 'my-action' );
foreach ( $_COOKIE as $name => $value ) {
	$cookies[] = "$name=" . urlencode( is_array( $value ) ? serialize( $value ) : $value );
}
$url = admin_url( 'admin-post.php' );
$args = [
	'method'      => 'POST',
	'timeout'     => 50,
	'redirection' => 5,
	'blocking'    => true,
	'headers'     => [] ,
	'body'        => [
		'action'   => 'gpc_nightly_job',
		'my_nonce' => $nonce
	],
	'headers'   => [
		'cookie' => implode( '; ', $cookies ),
	]
];
return wp_remote_post( $url, $args );
```
EDIT: For increased security, I added a nonce to the request, which is checking in the long-running function via `wp_verify_nonce`.