Problem with different query loops (and “main loop”) on category template page!

In order to provide more-specific help, we’ll need to know greater detail regarding exactly what’s happening that you don’t expect, or what’s not happening that you expect to happen, or what is happening differently from what you expect.

That said, there are at least two things that will likely help you:

  1. Use descriptive and unique variable names to hold your custom queries
  2. Include the if ( have_posts() ) part of the Loop
  3. Call wp_reset_postdata() instead of wp_reset_query()

Variable Names

You use the generic variable $arg to hold your custom query arguments, and the generic variable $loop to hold both of your custom queries. Instead, I would suggest:

$slider_query_args = array( 'post_type' => 'slider');
$slider_query = new WP_Query( $slider_query_args );

…and…

$teaser_query_args = array( 'post_type' => 'teaser');
$teaser_query = new WP_Query( $teaser_query_args );

Doing this makes your code easier to read/follow, helps ensure that you don’t mix the two custom queries, and helps avoid unintended consequences in the two custom query calls.

Full Loop Call

You use:

while ( $loop->have_posts() ) : $loop->the_post();

Instead, use:

if ( $slider_query->have_posts() ) : while ( $slider_query->have_posts() ) : $slider_query->the_post();
    // Loop output
endwhile; endif;

…and…

if ( $teaser_query->have_posts() ) : while ( $teaser_query->have_posts() ) : $teaser_query->the_post();
    // Loop output
endwhile; endif;

Reset Post Data after Custom Queries

Note: This one may very likely be your main problem.

The wp_reset_query() function is intended to reset the main query after it has been altered (e.g. via query_posts()). Since you’re not altering the main query, calling wp_reset_query() isn’t going to do anything for you.

Instead, use wp_reset_postdata(), which is intended to reset the $post global variable, and all the related template tags (e.g. the_title(), the_content(), the_permalink(), etc.) to refer once again to the main query. Since you’re calling the_post() in your custom query loops, you’ll want to use wp_reset_postdata():

// Slider Loop
if ( $slider_query->have_posts() ) : while ( $slider_query->have_posts() ) : $slider_query->the_post();
    // Loop output
endwhile; endif;
// Rest postdata
wp_reset_postdata();

// Teaser Loop
if ( $teaser_query->have_posts() ) : while ( $teaser_query->have_posts() ) : $teaser_query->the_post();
    // Loop output
endwhile; endif;
// Rest postdata
wp_reset_postdata();

// Main Query Loop
if ( have_posts() ) : while ( have_posts() ): the_post();
    // Loop output
endwhile; endif;