Loop starts from the beginning with second while loop on author.php

When the loop is complete, have_posts() rewinds it back by calling the rewind_posts() method of the $wp_query object, see here.

Here’s another (more simple?) setup that you could try:

while( have_posts()): the_post();
   if ( 0 == $wp_query->current_post ): 
       // post 1   
   elseif ( 1 == $wp_query->current_post ): 
       // post 2      
   else:        
       // other posts   
   endif;
endwhile;
wp_reset_postdata();

where we use the current_post property of the global $wp_query object to keep the track of the current post.