Every data type is going to need its own view function, right? (I am assuming your thingList corresponds to the "List data" argument to Table.view.) It seems like that would be the logical place to put the pagination logic.
Your pagination could be encapsulated by a function like "paginate : Config -> List a -> List a" that is perfectly generic and calls List.take or whatever. Each of your view functions could then call this function.
Yes, the call to paginate would be duplicated in each of your view functions, but it is a better sort of duplication than, say, defining take/drop on your over-arching ThingList type and having tons of case statements. It will be easier to maintain, and easier on the eyes!
In my (recent, painful) experience, Elm works much better when you focus on "vertical encapsulation" -- your main union type has a case statement in your outer "update" function, your outer "view" function, and nowhere else. What you are trying to do with your list operations, I would describe as "horizontal encapsulation" -- trying to define as many operations as possible on your main union type.
If you focus on vertical encapsulation, Elm will make your life easy. If you focus on horizontal encapsulation, Elm will be your enemy every step of the way.