Differentiate Nested WP_Query from Parent

You could check if the current post ID is the same as the ‘queried object’ ID, which is whichever post the current URL represents, and is separate from the current post within the loop. If both those IDs are the same then you can assume that the current content being filtered is for the content of the main post, and not a nested query for a different post.

function wpse_308358_content_filter( $content ) {
    if ( is_single() && get_queried_object_id() === get_the_ID() ) {
        $content .= 'Appended content.';

    return $content;
add_filter( 'the_content', 'wpse_308358_content_filter' );

is_single() adds protection against the possibility that you’re displaying the full content on category archives and you have a category that happens to have the same ID as a post.