Using pre_get_posts to filter one loop in a multiloop archive

Add the filter where you need it and remove it afterwards.

add_action('pre_get_posts','blog_filter');
// your query; presumably WP_Query
// your first loop
remove_action('pre_get_posts','blog_filter');
// another query; presumably WP_Query
// your second loop

You can also make your action self-removing:

function blog_filter($query) {
  remove_action('pre_get_posts','blog_filter');
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_post_type_archive('rg_blog')) {
      $query->set('post_type', 'post');
    }
  }
}
add_action('pre_get_posts','blog_filter');

Your code, reorganized:

// define the function; can be here or functions.php
function blog_filter($query) {
  if ( !is_admin() && $query->is_main_query()) {
    if ($query->is_post_type_archive('rg_blog')) {
      $query->set('post_type', 'post');
    }
  }
}

get_header(); 

  // blog title and description query
  $post_id = 4606;

  // add the filter
  add_action('pre_get_posts','blog_filter'); 

  $queried_post = get_post($post_id);

  // remove the filter; the query is done
  remove_action('pre_get_posts','blog_filter'); 

  $title = $queried_post->post_title; ?>
  <h1><?php echo $title;?></h1><?php

  // Main Loop (All Posts)
  $post = $posts[0];
  $c=0;
  if (have_posts()) {
    while (have_posts()) {
      the_post(); 
      // Featured Post
      $c++;
      if( !$paged && $c == 1) {
        // stuff 
        // Other Posts
      } else {           
        // the remaining posts          
      }
    }
  }
  // The end of the loop
  // third loop, a repeat of loop 1

  // blog title and description query
  $post_id = 4606;
  $queried_post = get_post($post_id);
  $title = $queried_post->post_title; ?>  
  <h1><?php echo $title;?></h1><?php 
  echo $queried_post->post_content;
get_footer();

I have not tested that but I think it will work better. Hopefully, I don’t have any syntax errors.

Edit:

I took a closer look at your code (while not watching “Defiance”) and notices a couple of things.

  1. Your filter will only effect the main query so you will need to add
    it before the page template loads– probably in functions.php. But
    my understanding of the question is that the filter is meant for a
    secondary Loop. That would mean that that “main query” check is
    wrong.
  2. You are requesting posts via get_post by ID, so for those the
    filter is irrelevant.

So, to filter that main query you need this in functions.php:

// define the function; can be here or functions.php
function blog_filter($query) {
  // remove the filter; the query is done
  remove_action('pre_get_posts','blog_filter');
  if ( !is_admin() && $query->is_main_query()) {
    if ($query->is_post_type_archive('rg_blog')) {
      $query->set('post_type', 'book');
    }
  }
}
add_action('pre_get_posts','blog_filter'); 

And no add or remove actions anywhere else. I am not sure that is what you want though. The two get_post calls should be unaffected.