Details and solution taken from Alkampfer's Place.
Possible solution, requires object implements ICloneable:
public IList<T> SafeList<T>(IList<T> input) where T : class, ICloneable {
//Symply check the type of the first element.
if (input.Count > 0) input[0] = (T) input[0].Clone();
return input;
}
If object does not implement IClonable then need to turn off Lazy loading in mapping file.
Final Solution
As it was not pratical to make all objects ICloneable or to turn off lazy loading we finally settled on clearing the cache (Session.Clear) prior to executing queries or criterias.