This brings me to a side question: should I have an "Unapproved" or "Unassigned" role as a default role?
It depend, you can do so, or consider make a role as default, in your case, perhaps Parent is the default role and parent can create user with child role only...
should I just hardcode my list of roles somewhere within my models (or somewhere else) instead of storing this information in the database?
if you are pretty sure your application will NEVER change then you can hardcode it for simplicity, but if you want to manage it, store it in database is better choice so you can rename it, add new role...
just to clear up a few things with my User model, it sounds like I'd have a nullable parent_id field on all of my User models, is that correct?
I think it's nothing wrong to have a nullable or 0 parent_id to determine the user as parent, to database, it's just a value, but you are the brain on the system to decide how to do with this value...
the policy is usually functions as declaration of the rules/policies to determine what condition to allow on that MODEL, so that you can call the policy checking on your controller or blade file...