Using Wp_Query without the loop?

The query itself doesn’t change globals, however you are correct that the_post() does.

The most contained way to just retrieve posts (as array of results) is using get_posts() function, which is wrapper around WP_Query and takes same arguments.