Watch four walls close in on a grid as it is read in spiral order. Every cell read once, nothing marked visited: O(R × C) time, O(1) extra space.
Read a grid in spiral order: along the top, down the right side, back along the bottom, up the left side. Then one ring further in, until nothing is left.
Keep four bounds (top, bottom, left and right) around the cells not read yet. Everything between them is still to read; everything outside has been read once.
Read the whole top row, then move the top wall down one row. Same for the right column (right wall left), the bottom row (bottom wall up) and the left column (left wall right).
The walk turns when the next cell is outside the walls: off the grid, or a cell an outer ring already read. No visited set needed: the walls ARE the memory.
Once top passes bottom or left passes right, there is nothing between the walls. Check after the right column too: on a non-square grid the walls can pass mid-ring, and reading on would read a row twice.