Find The Duplicates using binarySearch python
Given that len(arr1) == n and len(arr2) == m, the bisection method has a \$O(n \log m)\$ time complexity. Notice that it is important which array is scanned, and which is bisected. You really want arr1 to be shorter than arr2 (do you see why?).
That said, in case M ≈ N the bisection method has \$O(n \log n)\$ time complexity. However in this case you can achieve \$O(n)\$. The same linear algorithm applied to the general case yields \$O(n + m)\$. Picking the right one (\$O(n \log m)\$ vs \$O(n + m)\$) is the core of the question as I see it.

I intentionally do not spell the linear algorithm out. It is quite simple.
Returning value from b_search misses an opportunity to optimize further. Notice that both arrays are sorted, therefore you don't need to search the entire arr2 again and again: you are only interested in values to the right of where the last search ended.

Consider instead returning an index. It should not be an index of the element found, but one that partitions arr2 into strictly smaller, and larger or equal than val. A bisect module conveniently provides a bisect_left method:

    from bisect import bisect_left

    def find_duplicates(arr1, arr2):
        output = []
        index = 0
        for val in arr1:
            index = bisect_left(arr2, val, index)
            if arr2[index] == val:
                output.append(val)