Hey just wanted to let you know that I figured out the issue. I put some debug calls in the NormalizeWidgetDepths() function, and what was happening is that this function normalizes only ACTIVE widgets.
The panel I was working with had optional buttons, and when I didn't want a button to display I was setting it to Inactive, which meant when the rest of the panel was normalized those buttons stayed at the same depth. Then later, when the buttons WERE active, their old depth was behind the background sprite's new depth, and they would then get normalized to behind it.
I guess the proper way to make the buttons not visible is to just set their Alpha to 0 and set isEnabled = false.
But for future reference, if anybody is working with widgets that should stay at a certain depth relative to eachother, make sure they are either all active or all inactive at the same time so they don't get normalized to different depths.