すべての答えは機能しますが、常にリスト全体を横断します。私があなたの質問を理解しているなら、あなたは最初の試合だけが必要です。したがって、最初の一致が見つかった場合は、リストの残りの部分を考慮する必要はありません。
mylist = ['abc123', 'def456', 'ghi789']
sub = 'abc'
next((s for s in mylist if sub in s), None) # returns 'abc123'
一致がリストの最後にある場合、または非常に小さいリストの場合、違いはありませんが、次の例を検討してください。
import timeit
mylist = ['abc123'] + ['xyz123']*1000
sub = 'abc'
timeit.timeit('[s for s in mylist if sub in s]', setup='from __main__ import mylist, sub', number=100000)
# for me 7.949463844299316 with Python 2.7, 8.568840944994008 with Python 3.4
timeit.timeit('next((s for s in mylist if sub in s), None)', setup='from __main__ import mylist, sub', number=100000)
# for me 0.12696599960327148 with Python 2.7, 0.09955992100003641 with Python 3.4