I'd try an approach like this:
Iterate left to right row by row until you find a 0
.
This 0
may already identify two rectangles of 1
s:
- all rows above it
- from the top left to the position to the left of the
0
One of them is bigger, remember it.

Then recursively descend into the three unknown sectors (two of them partially unknown) that may still contain a rectangle bigger than what you have already found:

Make sure you don't iterate over the known rows again, that's redundant.
I believe this solution can look at each field at most twice (where a recursion step's sectors overlap), so it should run in θ(x*y).