I’m not entirely sure you want to call exit at the end of that function, since exit terminates all further PHP execution. This is likely the cause of your troubles.
http://php.net/manual/en/function.exit.php
That said, you can always test for the result of your queries by setting a variable to be the result, and then sending that as your $response.
if ($row) {
$qry_result = $wpdb->replace(
$table_name,
array(
'id' => $row->id,
'user_id' => $user_id,
'course_id' => $xxx_course_id,
'progress_percent' => $vimeo_percent,
'seconds_played' => $vimeo_seconds
),
array(
'%d',
'%d',
'%f',
'%d'
)
);
} else {
$qry_result = $wpdb->insert(
$table_name,
array(
'user_id' => $user_id,
'course_id' => $xxx_course_id,
'progress_percent' => $vimeo_percent,
'seconds_played' => $vimeo_seconds
),
array(
'%d',
'%d',
'%f',
'%d'
)
);
}
if( false !== $qry_result ) {
$qry_result = true;
}
$response = array( 'success' => $qry_result, 'data' => 'hello' ); //if $data is set
wp_send_json_success( $response );