Select some indexes in a list of lists
The only real change that pops out at me without touching the record datatypes is to make indexesToInclude an array, you're evaluating it over and over again in that seq comprehension each time. Since it's an array and lookups are fast, and you know its size, you might as well pre-allocate it instead of using a comprehension which will be much faster. Then do a mapi over the rows, and just look up if you want that index in the array.

type Table = 
    {
        Rows : string list list
        OnlyColumns : string list option
    } 
    member internal x.FilteredRows =
        match x.OnlyColumns with
        | None -&gt; x.Rows
        | Some xs -&gt; 
            let headers = List.head x.Rows |&gt; List.toArray
            let isIncluded = Array.init (headers.Length) (fun hi -&gt; xs |&gt; List.exists (fun lv -&gt; lv = headers.[hi]))
            x.Rows
            |&gt; List.map (fun row -&gt; row |&gt; List.mapi (fun i v -&gt;  (isIncluded.[i], v))
                                        |&gt; List.filter fst |&gt; List.map snd)


The most important thing here is that we're no longer indexing into a list (almost always a bad idea in F#), which costs O(n) where n is the index you're indexing into. If you do this every time it gets very expensive!