Don't cast the ModelItem
value. Changes at runtime must always be applied to the ModelItem
itself.
This is the equivalent to your code but changing the ModelItem instead. Not tested.
var modelItem = Designer.Context.Services.GetService<ModelService>().Root;
modelItem.Value.Properties["Variables"].Collection.Add(new Variable<bool>("a",false));