I am looking for a better pattern for working with a list of elements which each need processed and then depending on the outcome are removed from
Using .ToList() will make a copy of your list, as explained in this question: ToList()-- Does it Create a New List?
By using ToList(), you can remove from your original list, because you're actually iterating over a copy.
foreach (var item in listTracked.ToList()) {
if (DetermineIfRequiresRemoval(item)) {
listTracked.Remove(item)
}
}