Timed for loop... HELP!

Like Paul says a while loop is what you want.

unsigned long loopDuration = 500;
unsigned long loopStartTime = millis();
while (millis() - loopStartTime < loopDuration)
{
.... do loopy stuff
}

You do have to watch that this is no guarantee that the loop will only execute for 500 millis precisely. It will always loop for 500 millis but could go longer depending on what you do in there. Obviously if one instruction is delay(50000) the loop will run longer than 500 millis.

The problem with the for loop is that in your example i is incremented each time through the loop and has no real relationship to millis. Your loop will never exit unless it takes less than one milli second to execute the loop.