Modify main query before it run without pre_get_post

Rather than trying to set a global variable, just use the main query for both the widget and the other content. Simply adjust your Loop.

If you share more of your code perhaps we can help specify where this would go, but the general idea is to move the start of the Loop above wherever you need to display the widget. Use a counter to keep track of whether you’re looping through the first item (if so, show it in a widget) or not (show it in the main content area).

<?php get_header();
//
// your code - perhaps an outer container div, etc.
//
$counter=0; // set a counter
if(have_posts()): // start of normal Loop
while(have_posts()): the_post();
$counter++; // increment counter at each iteration
if($counter==1) { // only for first Post
    ?><div class="sidebar">
        <div class="widget">
            <?php the_title(); // add link, etc. as desired ?>
        </div>
    </div><?php
} else { // now show the rest of the Posts outside of the widget
    ?>
        <div class="maincontent">
            <?php the_title(); the_content(); // format as desired ?>
        </div>
    <?php
}
endwhile;
endif; // end Loop
//
// your code - perhaps an outer container div, etc.
//
get_footer(); ?>