dictionary[key]
возвращает копию записи, хранящейся в словаре.Компилятор не позволяет вам изменить это, потому что это бесполезно.
Кроме того, старые версии программы принимают ваш код, и было очень странно, что модификация записи будет потеряна.Вы бы сделали назначение, но ничего видимого не изменилось, потому что то, что вы назначили, было безымянной локальной переменной.
Очевидно, вы намереваетесь изменить запись, хранящуюся в коллекции.Для этого вам нужно назначить всю запись.Считайте запись из коллекции в локальную переменную.Изменить локальную переменную.Запишите обновленное значение обратно в коллекцию.Вот так:
var
rec: TMyRec;
...
rec := dictionary[key];
rec.a := 30;
dictionary[key] := rec;
Одним из неприятных аспектов этого является то, что код должен выполнить два поиска по словарю, даже если мы знаем, что второй найдет ту же запись, что и первый.Даже мощный словарь Spring4d не может сделать это с помощью одного поиска.