First I just had the script remove the player's hats when the character was added:
game.Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function(char)
char.Humanoid:RemoveAccessories()
end)
end)
Then I had it wait for the child humanoid, and also had it remove it a second time just in case.
game.Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function(char)
char:WaitForChild('Humanoid'):RemoveAccessories()
char.Humanoid:RemoveAccessories()
end)
end)
Neither of these remove the player's accessories.

3 comments
It's doing it, except for the first time a player loads in.
Just add a longer wait so for example wait(1) or wait(2), should fix this.
Alternatives that may be worthwhile investigating are, the Player's "CharacterAppearanceLoaded" event and the "HasAppearanceLoaded" function (looping until the function returns true)?