Alright so I have come to a conclusion that since your script which finds the PlayerGui works fine then it’s a problem from one of my many scripts that I am trying to change the GUIs with.
And I can confirm this because when I tried to do the exact same thing in an another baseplate that I created trying to change stuff with PlayerGui but in a different way it works, thank you for the long answer anyways you explained how this works very well!
It might have something to do with one of my plugins that I use to edit the GUIs or something, but outside of what i’m currently trying to do I can change GUIs using PlayerGui just fine, something might have glitched or something, I will just remake what I did so it can work.
UPDATE: I fixed the problem by simply getting the PlayerGui in the client and not in the server like this:
local playerGui = game.Players.LocalPlayer.PlayerGui
I didn’t have to use :WaitForChild() or anything.
And if I wanted to update it to everyone I will have to use a Remote Event then when the function fires get your Remote Event and just send a request to the server by inserting a Local Script into StarterGui and use :FireServer then insert a Script into ServerScriptService and use .OnServerEvent and then use :FireAllClients() inside it and in an another Local Script inside StarterGui just use .OnClientEvent and tell the game what you want to change about the GUIs from there.
I am writing all of this information so the people who have this problem and go search it in the dev forums to see if there’s a solution to the problem would find this and then easily fix it.
It wasn’t my scripts or plugins doing this but it was the HOW i’m trying to get PlayerGui and it was from the server I simply fixed all of this by getting the PlayerGui from the client like I said.