You have to replace the item, not the value of customListItem2. Just replace following:
customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
customListItem2 = newCustomListItem;
With this:
customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
var index = customListItems.IndexOf(customListItem2);
if(index != -1)
customListItems[index] = newCustomListItem;
Edit:
As Roman R. stated in a comment, you can replace the .Where(predicate).First() by a simple First(predicate):
customListItem2 = customListItems.First(i=> i.name == "Item 2");