Thanks, Massimo, what I ended up doing so far is:
1. Pre-registering users with register_bare(), using a random password and an empty user name
2. Sending out a password reset mail like you wrote
3. After the user changed the password, on the subsequent call of index(), having the app check whether the user name is empty and redirect to user/profile
This works, but the user experience for new users is less than ideal, as they get to see two forms in a row. In addition, the reset_password form lacks the nice password strength coloring feature - and the new users choose their first password here.
Do you see a way to present them with the actual register form or an equivalent single form?