# [Jelly], 26 bytes

    ṢŒrṪ4=$$Ðfx3ðœ-µẆm€6R¤;/µL

[Try it online!]

The input format is a little unusual; it's a string representing the board, but with Windows newlines (carriage return followed by newline). For example, `XXO\r\nOXO\r\nOOX`. (Actually, any two-character padding string between the lines works, but Windows newlines are much more defensible than the other options.)

The basic idea is that we look for characters that appear 4 times in the input, but don't have three evenly spaced occurrences in the original string. With two or more characters of padding between the lines of a 3×3 grid, all horizontal, vertical, and diagonal lines are evenly spaced, but no other evenly spaced line can have three elements.

Explanation:

The `ð` and `µ`s are *chain separators*, which split the program into multiple parts that are each independent. I've replaced them with spaces below, to make things a bit clearer.

    ṢŒrṪ4=$$Ðfx3 œ- Ẇm€6R¤;/ L
    Ṣ                           sorted version of the input
     Œr                         run-length-encode it
            Ðf                  keep only elements where
       Ṫ                        delete the last element, and it was
        4=                      equal to 4
          $$                    parse Ṫ4= as a group
              x3                repeat each element three times
    
                    Ẇ           all sublists of the input
                     m€         take every nth element of each (€) sublist
                       6R       for each n in 1..6
                         ¤      parse 6R as a group
                          ;/    flatten one level (m€ creates a nested structure)
    
                 œ-             multiset difference
                             L  length of that difference

In other words, we find the list of characters that appear exactly four times in the input, and make a list consisting of three copies of each of those; we find the list of all subsequences that are evenly spaced in the original string; and if we subtract the second from the first, we want the result to have length 1 (i.e. a player played four times but didn't win). Note that as we're on a 9×9 grid and every square is full, it's impossible for *both* players to have played four times. In Jelly, 1 is truthy, 0 is falsey, so we don't need to do anything special to convert the resulting list to a boolean. (The `µL` is required, though, because otherwise both `“XXX”` and `“OOO”` would be possible truthy output values, and the question requires that all valid boards give the same output.)

[Jelly]: https://github.com/DennisMitchell/jelly
[Try it online!]: https://tio.run/nexus/jelly#@/9w56Kjk4oe7lxlYquicnhCWoXx4Q1HJ@se2vpwV1vuo6Y1ZkGHlljrH9rq8////4gI/6I8fzDhHwEA "Jelly – TIO Nexus"