You can track item sublist modifications with Client Scripts, however if you want to consider all possible scenarios with an UserEvent script a common practice is to read and build an object or array of objects with all the lines and fields values of the newRecord object and compare them to the oldRecord object.
I’m not aware of another way to do this.