Exclude first post (sticky or not) from the loop using query_posts()

You shouldn’t really need to “exclude” anything. Just make use of the built in loop tracking. WP_Query will “remember” where you left off. For example:

if (have_posts()) {
  while (have_posts()) {
    the_post();
    echo 'firstpost##';
    the_content();
    echo '##endfirstpost';
    break;
  }
}

// do some other stuff

if (have_posts()) {
  while (have_posts()) {
    the_post();
    echo 'otherposts##';
    the_content();
    echo '##endotherposts';
    break;
  }
}

Or just roll the code into the same loop:

if (have_posts()) {
  while (have_posts()) {
    the_post();
    if (0 == $wp_query->current_post) {
      echo 'firstpost##';
    else {
      echo 'otherposts##';
    }
    the_content();
    if (0 == $wp_query->current_post) {
      echo '##endfirstpost';
    else {
      echo '##endotherposts';
    }
    break;
  }
}