Query: offset post list, unless it’s a specific category

As already stated, you should never (my emphasis) use query_posts to construct custom queries.

Note: This function isn’t meant to be used by plugins or themes. As explained later, there are better, more performant options to alter the main query. query_posts() is overly simplistic and problematic way to modify main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination). Any modern WP code should use more reliable methods, like making use of pre_get_posts hook, for this purpose.

Just two side notes on your question and answer (which is way better use of code than your question BTW :-))

  • showposts has been depreciated in favor of posts_per_page

  • NEVER forget to reset any custom query. As described in your answer, the output is expected from your code as you have not reset your queries. Custom queries influence any query after it if the postdata is not reset. Use wp_reset_postdata() after every custom query

This is how your code should look like

<?php $sticky = new WP_Query(array ('posts_per_page' => '1', 'cat' => '-11'));
if ($sticky->have_posts()) : 
    $stickyid = array(); 
while ($sticky->have_posts()) : $sticky->the_post(); 
$stickyid[] = $post->ID;
get_template_part( 'content', 'archives' );
endwhile; endif;
wp_reset_postdata();

$latestposts = new WP_Query(array ('posts_per_page' => '3', 'post__not_in' => $stickyid));
if ($latestposts->have_posts()) : 
    while ($latestposts->have_posts()) : $latestposts->the_post();
get_template_part( 'content', 'archives' );
endwhile; endif; 
wp_reset_postdata(); ?>