any((needle[len(start):] in b_set for start in a if needle.startswith(start)))

In contrast to the itertools.product this solution does not have to compare all n^2 possible combinations, but has just to walk once over the first list (n) and in worst case do an additional set lookup.