How can I have a page on a site that isn’t a ‘Page’ in the WordPress sense?

You can add a new endpoint for your profile page. There’s no need to manage anything with the htaccess. WordPress will do it for you.

codex: add_rewrite_endpoint

Another way (half solution) is to create a template file and load it via template_include hook. But it will not get the user name (as it is).

add_filter( 'template_include',  array($this, 'profile_page'), 99 );

function profile_page($templates){
    if ( is_page( 'profile-page' ) ) {
        $new_template = YOURPLUGIN_DIR .'templates/profile-page';
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }
}

Create a page with permalink set to profile-page and create functions and profile page content…

EDIT:

Here a rewrite complete class for a profile user page, without the need to create a page.

class wpse242114{

public function __construct(){

    add_action( 'wp_loaded', array($this,'_flush_rules') );
    add_filter( 'rewrite_rules_array', array($this,'_insert_rewrite_rules') );
    add_filter( 'query_vars', array($this,'_insert_query_vars') );
    add_filter( 'template_include',  array($this, '_get_plugin_template'), 99 );
}

public function _flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['(profile)/(\d*)$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}

public function _insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules['(profile)/(\d*)$'] = 'index.php?pagename=$matches[1]&id=$matches[2]';
return $newrules + $rules;
}

public function _insert_query_vars( $vars ) {
array_push( $vars, 'id' );
return $vars;
}

public function _get_plugin_template($template){
    global $wp_query;

    if ( $wp_query->query['name'] == 'profile') {

        $new_template = APIKEYABLE_DIR .'includes/templates/page-login.php';
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
  }
}

The template file example:

<?php get_header(); ?>

<div class="container">
   <div id="main-grid" class="row">

      <div id="primary" class="content-area col-md-8">
        <main id="main" class="site-main" role="main">

        <?php
        $userid = get_current_user_id();

        $user = new WP_User($userid);

        if ( $user->exists() ) {
            // do something

        }

       </main><!-- #main -->
    </div><!-- #primary -->

  <?php get_sidebar(); ?>

</div><!-- .row -->