Sub-loop / nested loops Best Practices

First see When should you use WP_Query vs query_posts() vs get_posts()?

My understanding of “The Loop” is that there is, and should only ever be, ONE “The Loop” per page/post – and that The Loop is responsible for iterating through that page/post/archive’s content.

Yes, it’s commonly referred to as “main loop”. But “loop” in general can refer to iterating through any set of posts.

Or is $subQuery->have_posts() safe to use (ie: read only)?

Yes, it’s just a way to check if loop has posts that had not been iterated yet.

What about ->the_post()? Does it affect The Loop globals?

Yes, it does. After loops that use the_post() (function or method) you need to call wp_reset_postdata() (or more global wp_reset_query() if you was messing with main loop) to cleanup global variables.

What’s the best practice for iterating through elements of a nested sub-loop that will not interfere with The Loop?

This depends if you need to use template tags that rely on global $post, so there are several approaches. You can iterate through new WP_Query object and cleanup afterwards or just fetch array with get_posts() and do something with it.