First just to make sure the flow is clear to Kofifus, when you create a user via createUserWithEmailAndPassword, the email is unverified but you do get a firebase.User logged in. You then call auth.currentUser.sendEmailVerification() and tell the user to check their email in order to verify their account. You do not need to logout the user but you can check in auth state change that auth.currentUser.emailVerified is true, if not, tell them that they need to verify their email before they proceed.
Keep in mind once the link is clicked, a refresh of the page will update the emailVerified status without the need to login the user again (since you kept the user logged in).
There are currently no event listeners to detect email verified status change but the ideas proposed are interesting and very valuable. We will take those into account for future improvements and possible feature requests.
Here are some of the options you have now:
Build your own landing page handler. You have to configure the url for that in the firebase console, the section with the email templates. We are in the process of updating our docs with comprehensive instructions on how to do so. You then parse the code from the url and call applyActionCode on it. On verification, you can then redirect the user to your app page (the default one does not currently handle the redirect). On redirect, if the user is still logged in on the same device, the emailVerified field will be set to true and you can continue the sign in process.
If the user is logged in in the same browser where the link is clicked, you can set some flag in the firebase database and on the original page where the sign up process started, listen to that flag change. On change, you can trigger auth.currentUser.reload() and check emailVerified. If true, complete the sign in flow.
Another simple option is to have a button to "continue sign in flow after verification" show up when the email is sent after sign up. The user after clicking the link can then go back to the same page and click that button, you would call reload and then check emailVerified. If true, complete the sign in flow.
All the options above work best if all the actions are handled on the same device/browser where you keep the user logged in. If the user opens the link in another device, they will have to sign in to the account created and you would quickly detect the emailVerified field changed to true.
One more option, while not ideal but achieves your goals, is to build the custom email verification handler page to simply display the code with instructions to copy and paste it in the original page. Previously on create user, you keep the user signed in, call sendEmailVerification, tell the user to get the code from the link provided and display a field for the user to paste the code in. When the user pastes the code, you then applyActionCode, call reload, confirm email verified and complete the sign in flow.