The best option I've seen were recently-solved small problems. We would roll back a few commits, take that code into the room with the candidate, and pair-program a solution or partial solution in a fairly tightly-scoped time period, and then review the solution with another interviewer. That way, we've got an idea of what to work towards, usually still a pretty solid sense of where the problem exists in the context of the overall app, and we hit a couple of crucial skillsets - collaborating on a project, reviewing code. It wasn't perfect, but it worked reasonably well.