Do both of them extract a subset of ALL posts into an array that can be passed into another Loop?
Yes. However, with query_posts() you don’t need to use the setup_postdata() function, while with get_posts() you do. The other thing I have noticed is that after using query_posts(), the is_archive() conditional tag returns TRUE. So if you’re going to use the conditional tags (is_single(), is_page(), is_archive(), etc.), do not use query_posts().