It shows more than 3 posts because you used post_per_page
when it should be posts_per_page
(note the plural “posts”).
But actually, you can use the same query and use a counter to display the different template parts:
$loop = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
) );
$c = 1; // post counter
while ( $loop->have_posts() ) : $loop->the_post();
if ( $c < 3 ) : // the first and second posts
get_template_part( 'loop-templates/blog-item-big' );
else :
get_template_part( 'loop-templates/blog-item-small' );
endif;
$c++;
endwhile;
/* Or a simpler loop..
$c = 1; // post counter
while ( $loop->have_posts() ) : $loop->the_post();
$template="blog-item-" . ( $c < 3 ? 'big' : 'small' );
get_template_part( 'loop-templates/' . $template );
$c++;
endwhile;
*/
// not wp_reset_query()
wp_reset_postdata();