Toutes les réponses fonctionnent mais elles parcourent toujours la liste entière. Si je comprends bien votre question, vous n'avez besoin que de la première correspondance. Vous n'avez donc pas besoin de considérer le reste de la liste si vous avez trouvé votre première correspondance :
mylist = ['abc123', 'def456', 'ghi789']
sub = 'abc'
next((s for s in mylist if sub in s), None) # returns 'abc123'
Si la correspondance se trouve à la fin de la liste ou pour de très petites listes, cela ne fait pas de différence, mais considérez cet exemple :
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