Я предполагаю, что это было тяжело, но чтобы ответить на ваш исходный вопрос, я собрал все идентификаторы постов в массиве в первом цикле и исключил эти посты из второго цикла, используя 'post__not_in', который ожидает массив идентификаторов постов.
<?php
$args1 = array('category_name' => 'test-cat-1', 'order' => 'ASC');
$q1 = new WP_query($args);
if($q1->have_posts()) :
$firstPosts = array();
while($q1->have_posts()) : $q1->the_post();
$firstPosts[] = $post->ID; // add post id to array
echo '<div class="item">';
echo "<h2>" . get_the_title() . "</h2>";
echo "</div>";
endwhile;
endif;
/****************************************************************************/
// array of post id's collected in first loop, can now be used as value for the 'post__not_in' parameter in second loops query $args
$args2 = array('post__not_in' => $firstPosts, 'order' => 'ASC' );
$q2 = new WP_query($args2);
if($q2->have_posts()) :
while($q2->have_posts()) : $q2->the_post();
echo '<div class="item">';
echo "<h2>" . get_the_title() . "</h2>";
echo "</div>";
endwhile;
endif;
?>
Первый цикл отображает все сообщения в категории и собирает идентификаторы сообщений в массив.
Во втором цикле отображаются все сообщения, кроме сообщений из первого цикла.