Thanks for buying my book, but what you're trying to do is somewhat beyond it.
Personally, I would not try to write a query to handle this. I'd do a custom snippet.
Basically, you read each users data from the CSV file, then create two arrays -- one for the modUser object, and one for the modUserProfile object. Let's call them $userArray and $profileArray.
The fields for each one are here:
https://bobsguides.com/modx-object-quick-reference.html#modUser and here:
https://bobsguides.com/modx-object-quick-reference.html#modUserProfile. Not all fields are required -- (Important: don't fill in the id for either one, and don't fill in the 'internalKey' for the profile).
Then, you do something like this:
$user = $modx->newObject('modUser');
$user->fromArray($userArray);
$profile = $modx->newObject('modUserProfile');
$profile->fromArray($profileArray);
$user->addOne($profile);
$user->save();
You can definitely import other tables into the MODX DB (I would). It's recommended that you use a different prefix for them (e.g., NOT modx_).
You can definitely make them xPDO-friendly. It's not necessary (you can access them with PDO), but it makes your life much easier if you're familiar with xPDO. There's some info on it, and a script to make them xPDO-friendly, here:
https://bobsguides.com/custom-db-tables.html.
One option, depending on how secure your site needs to be, is to set each user's password to their username, then encourage them to change their passwords.
Do this just before the $user->save() line:
$user->set('password', $username);
Don't set any of the other password fields (hash_class, salt, cachepwd).