What am I missing?
ToList() creates a new list with all elements found in FieldOfStudy. It does not modify the original enumeration.
In fact, there is no guarantee anything can modify the original enumeration; it is well possible FieldsOfStudy is actually an array (and thus no elements can be added).
Bottom line: You are not supposed to modify something provided as IEnumerable<T>. If you want FieldsOfStudy to be mutable, declare it typed to an interface that provides methods for modifying the list, such as IList<T> or ICollection<T>.
Design philosophy: If you declare the FieldsOfStudy property as IEnumerable<T>, you indicate that the object returned from that property might be anything that implements IEnumerable<T>. If, in calling code, you rely on casting that object to something more specific (something to which items can be added), that calling code might break when the implementation of the FieldsOfStudy property changes. Things may be a bit different if the FieldsOfStudy property can be assigned to, as calling code can then control what is stored in the property.
x.FieldsOfStudy.ToList()creates a new list which you discard then; it should be something likex.FieldsOfStudy.Add(term);