Unfortunately, this is expected behavior. When you read the FontFace property, it actually creates a copy of the object and returns it. When you set the properties of that object, it only sets them on the copy and not on the original. This is a limitation that we can’t fix currently.
The workaround is a bit ugly, which is to do something like this instead:
local label = game.StarterGui.ScreenGui.TextLabel
local font = label.FontFace
-- Set properties on copy
font.Style = Enum.FontStyle.Italic
font.Bold = false
-- Set to updated copy
label.FontFace = font
The reason this isn’t noticeable with other data types like Vector3 is because their properties can’t be modified like this. For example, workspace.Baseplate.Position.X = 2 will throw an error saying X cannot be assigned to.
In the future, we’re hoping to add a script analysis warning in cases like this, to help avoid bugs caused by this.