I found the problem.
The docs show that the defaultSymbology for the UniqueValueRenderer is "optional" so I did not provide one as I am capturing and using all possible values in the target attributeField(s).
So I only passed the attributeField name into the new renderer, but by doing this the graphicsLayer renderFields property was not updating.
I added a place holder for the default symbology ("") and passed it in with the attributeField to make it work.
The refresh method was working all along, but it couldn't apply symbology to an undefined attributeField, duh.
Guess the gotcha here was that the defaultSymbology is not really, really optional; you have to pass something in its places so that the required attributeField is read correctly.