Sorry for the delay. I've been thinking about this. I'm still not sure what's happening, but I think there are two things at work. One is that because it's the Register snippet, at the time my code runs, the user hasn't been created yet, so there's no real ID available. The 'id' field in the ext_user_data table is arbitrary and it's value isn't used anywhere. The userdata_id is critical, though, and should correspond to the user's ID in the modx_users table. Putting the snippet below the Register snippet won't work because Register redirects the user and the data would be lost.
The second thing is that I expected that the userdata_id would be set to 0, but I think it's being set to 1 because you're logged into the Manager and that's your ID. I could be wrong.
A possible solution is to run the snippet as a Register postHook (possibly with &persistParams=`1`), but it would have to be rewritten to get the data with $hook->getValue(). I think it would work, but I'm not sure. Unfortunately, I don't have time to mess with it right now.
It might also be possible to put the snippet on the "thanks for registering" page with &persistParams=`1`. At that point the user should exist, but I'm not sure what &persistParams actually does.
Remember that my original snippet is designed to update an existing user's profile, so $modx->user would always give access to the user's ID.
BTW, the record not being deleted when you delete a user is normal because the modUser object doesn't know about the custom table. The record has to be removed in a plugin attached to OnUserRemove. I think this would be the code (assuming that the userdata_id fields are correct):
$userId = $user->get('id');
$extUser = $modx->getObject('userData',array('userdata_id' => $userId));
if ($extUser) {
$extUser->remove();
}