I'd use \b\S*t\b. It fixes the problem of the engine having to scan a word only to fail to find the non-word character and try the other branch in your pattern. At the very least, swap the two sides of the alternation because the common-case is that the word won't have a contraction.
>>> import re
>>> s = "mitt cat bat don't foobar"
>>> re.findall(r"\b\S*t\b", s)
['mitt', 'cat', 'bat', "don't"]
It's not clear how you want to treat non-word punctuation, but consider a variant that attempts to handle this:
>>> s = "mitt cat bat. don't foobar tee t e.t."
>>> re.findall(r"\b\S*t\b", s)
['mitt', 'cat', 'bat', "don't", 't', 'e.t']
>>> re.findall(r"\b[^.,!?\s]*t\b", s)
['mitt', 'cat', 'bat', "don't", 't', 't']
Clearly, abbreviations and edge cases may need attention if that's part of your specification.