Yes there is a way using only one loop but that can be messy and have on resources for large amounts of data,
To do that you simple store all of the output as a variable and only output after you finished your loop, ex:
$tax_array = array();
$output="";
while ( have_posts()) {
the_post();
$output .= '<div class="item">';
$output .= '<div class="item_title">'.get_the_title().'</div>';
$output .= '<div class="item_content">'.get_the_content().'</div>';
$output .= '</div>';
$temp = wp_get_object_terms($post->ID,'tax_name');
$tax_array = array_merge($tax_array,(array)$temp);
}
so after this single loop you have all of the items output in $output
and $tax_array
holds an array of all terms that you need.