Custom page slug without creating a WP page

You’re close, the query var for passing page slug is pagename:

add_filter('query_vars', 'add_account_edit_var', 0, 1);
function add_account_edit_var($vars){
    $vars[] = 'account-edit';
    return $vars;
}

add_action( 'init', 'add_account_edit_rule' );
function add_account_edit_rule() {
    add_rewrite_rule(
        '^my-account/([^/]*)/?',
        'index.php?pagename=my-account&account-edit',
        'top'
    );
}

To capture the value in your rule, you need to pass the value in $matches[1]:

add_rewrite_rule(
    '^my-account/([^/]*)/?',
    'index.php?pagename=my-account&account-edit=$matches[1]',
    'top'
);