Если вы передаете ссылки на объекты вокруг, и эти ссылки на объекты остаются неизменными, то любые изменения, внесенные в объект в слое постоянства, будут немедленно видны любым другим потребителям объекта. Однако, если ваш объект пересекает служебную границу, тогда сборки на каждой стороне объекта будут просматривать разные объекты, которые являются просто копиями. Кроме того, если вы сделали клоны объекта или создали анонимные типы, которые включают свойства исходного объекта, их будет сложно отследить - и, конечно, для GC это новые объекты, которые не имеют привязки к объекту. оригинальный объект.
Если у вас есть какой-то ключ или идентификатор в объекте, это становится проще. Ключ не обязательно должен быть идентификатором базы данных, это может быть GUID, который обновляется при создании экземпляра объекта и не изменяется в течение всего жизненного цикла объекта (т. Е. Это свойство имеет getter, но не setter) - поскольку это свойство сохраняется в границах службы, поэтому ваш объект все равно будет идентифицируемым. Затем вы можете использовать LINQ или даже старомодные циклы (icky!) Для перебора любой коллекции, которая может содержать копию обновленного объекта, и, если она найдена, вы можете объединить изменения обратно.
Сказав это, я не думаю, что у вас слишком много копий. Если вы делаете это, то места, где находятся эти копии, должны быть очень локализованы. Гарантия того, что ваш объект реализует INotifyPropertyChanged, также поможет распространять уведомления об изменениях, если вы удерживаете список в одном месте, которое затем прямо или косвенно связано в нескольких других местах.