В пылу дискуссии как будто бы затерялся тот факт, что в условиях бывает не только счетчик с шагом.
Сам я обычно и выбираю конструкцию исходя из того, сводится ли условие к обнаружению значения счетчика в заданном диапазоне.
В общем, исхожу из определения, данном, кажется, во встроенной в turbo pascal справке:
for -- цикл с заданным числом повторений.
do while во флеш-практике таки приходилось использовать, но пример не вспомню.
А вот в вышеупомянутом паскале с его помощью логичнее всего обрабатывалось нажатие определенных клавиш. По крайней мере, тогда мне так казалось

Сейчас утверждение кажется несколько сомнительным.
Добавлено через 7 минут
Насчет абстракций более высокого уровня и их (уровней) разделения.
В тех местах, где производительность не критична, или работа находится на начальном этапе, все же стремлюсь к использованию for-in\for-each-in, когда задача сводится к перебору, так как "для каждого из ${список элементов предметной области\ уровня}" звучит куда более близко по смыслу к цели. А заодно от лишней на этом уровне сущности счетчика избавляемся.
Добавлено через 18 минут
Но вот использовать высокоуровневые примочки Array\Vector с коллбеками (кроме сортировки, ессна) побаиваюсь традиционно. И даже местами переписываю в более примитивные конструкции.
Отчасти из-за отсутствия типизации функций, отчасти из-за... отсутствия привычки, быть может.
Второй аргумент не особенно убедителен, так что очень интересно...
что же скажут профи про опыт использования методов (forEach\every\some\map\filter)!