今ごろ思いつきました。これでいけそうです。bcc32,VC++で確認。
しかし、これは動作が保障されているのかな?

# 今までforループを考えうる n の最大数分書いて
# いらない部分のループは continue で逃げる方法をとっていました。

void nfor(unsigned int n)
{
  int  i[10], j=0;
  switch(n){
    case 9: for(i[9]=0; n>=9 && i[9]<2; ++i[9])
    case 8: for(i[8]=0; n>=8 && i[8]<2; ++i[8])
    case 7: for(i[7]=0; n>=7 && i[7]<2; ++i[7])
    case 6: for(i[6]=0; n>=6 && i[6]<2; ++i[6])
    case 5: for(i[5]=0; n>=5 && i[5]<2; ++i[5])
    case 4: for(i[4]=0; n>=4 && i[4]<2; ++i[4])
    case 3: for(i[3]=0; n>=3 && i[3]<2; ++i[3])
    case 2: for(i[2]=0; n>=2 && i[2]<2; ++i[2])
    case 1: for(i[1]=0; n>=1 && i[1]<2; ++i[1])
    case 0: for(i[0]=0; n>=0 && i[0]<2; ++i[0]){
        /* i[0〜n]を使った処理 */
      }
      break;
    default: return;
  }
}