You are modifying a class/static variable and not a state variable. Class variables are shared across all instances of the same class. Instance variables need to set to the self property.
As stated by @BatWannaBe and @WonderCricket, When you modified the string class variable, you removed that instance's reference to the original class property. Modifying the dictionary required accessing the property and modifying its internal state, but the root reference to the same dictionary was not changed.
class Apple:
def __init__(self):
self.prop = { 'color': 'red' }
self.color2 = 'red'
a1 = Apple()
a2 = Apple()
a1.prop['color'] = 'blue'
a1.color2 = 'blue'
print(a1.prop, a1.color2)
print(a2.prop, a2.color2)