Bidirectional BFS on a matrix in Python 2.7
isValidIndex handling two "indices" seems wrong. At least the condition you spell becomes too long. Besides, the condition looks somewhat inside-out. Consider

def isValidIndex(index, grid):
    return 0 &lt;= index[0] &lt; len(grid) and 0 &lt;= index[1] &lt; len(grid[0])


That said, AFNP principle tells that you don't really need this function at all:

    for (x1,y1,x2,y2) in queries:
        try:
            result.append(findPath(x1,y1,x2,y2,grid))
        except IndexError:
            results.append(0)

find_path_from_source has an execution path which returns nothing. Here you can get away with it, but the practice is in generally dangerous and indicates sloppy coding.
The repetitive code in find_path_from_source should be wrapped in the loop:

    for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
        try:
            if bool_grid[x + dx][y + dy] == other_val:
                return 1
            if bool_grid[x + dx][y + dy] == 1:
                bool_grid[x + dx][y + dy] = val
                queue.append([x + dx, y + dy])
        except IndexError:
                pass

The bool_grid name is misleading. What is bool about it?
Copying a large grid may hurt the performance. An alternative is to compare visited cells: once they have a common element, the path is found. Implementing them as sets may make it quite fast. Of course, when in doubt, profile.