I was not satisifed with the way the field is dimmed and the value can't be accessed in a color field when it is read-only.
I added custom get
and set
methods to ensure the user can't modify it from the interface, while being able to click the field and copy the values inside the RGB widget.
import bpy
bpy.types.Object.my_prop = bpy.props.FloatVectorProperty(
subtype="COLOR",
set=lambda s, c: None,
get=lambda s: s["my_prop"],
min=0,
max=1
)
for obj in bpy.data.objects:
obj["my_prop"] = (0.5, 0.3, 0.2)

You can still change the property with a custom Hex value using the interface, but I guess this is managed differently so I don't know how to prevent that. You can also change the HSV sliders but the changes will be discarded when you exit the widget.