El problema aquí es que su concepto es completamente defectuoso. Está asignando un mapa a la Clase y no a la instancia con esta línea:
User.metaClass.dynamicAttributes = [:]
Para lograr lo que está buscando, debe hacer lo siguiente:
User.metaClass.propertyMissing = { String name ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name]
}
User.metaClass.propertyMissing = { String name, value ->
if (!delegate.dynamicAttributes) delegate.dynamicAttributes = [:]
delegate.dynamicAttributes[name] = value
}
Estoy seguro de que hay una forma más limpia de hacer esto, pero lo anterior demuestra una solución en la que el mapa se instancia por instancia y no en todas las instancias.