Having attempted various work arounds the way I have this to work is to not use the_post(). WP_Query should still work but I have swapped over to get_posts().
$results = get_posts( $args );
foreach ( $results as $p ):
$array[$p->ID] = $p->post_title;
endforeach;
return $array;
Frustrating that this seems to be a problem with certain admin pages.
Here is a ticket related to the issue: https://core.trac.wordpress.org/ticket/18408