3カラム目で折り返したい場合(4カラム目から次の行)の例です。
マークアップはこんな感じ。
<div class="flex-items"> <div class="flex-items__item">1</div> <div class="flex-items__item">2</div> <div class="flex-items__item">3</div> <div class="flex-items__item">4</div> <div class="flex-items__item">5</div> <div class="flex-items__item">6</div> <div class="flex-items__item">7</div> <div class="flex-items__item">8</div> <div class="flex-items__item">9</div> </div>
.flex-items {
display: flex;
flex-wrap: wrap;
}
.flex-items::after {
content: '';
width: 100%;
}
.flex-items__item:nth-child(n+4) {
order: 1;
}
仕組みは order です。
order の初期値は 0 のため、1~3カラムは order: 0
4カラム目以降が order: 1
となります。
さらに、::after 疑似要素で追加されたコンテンツが .flex-items の最後に追加されるので、
.flex-items__item:nth-child(1) order: 0
.flex-items__item:nth-child(2) order: 0
.flex-items__item:nth-child(3) order: 0
.flex-items__item:nth-child(4) order: 1
・
・
・
.flex-items__item:nth-child(9) order: 1
.flex-items::after order: 0
となります。
これを order に従って順番を入れ替えると、疑似要素は width: 100% なので1カラムから3カラムは横並び、4カラムから次の行となるわけです。

もうひとつ ::before 疑似要素が残っているので、もう1カ所指定することも可能です。
::before 疑似要素は .flex-items の先頭に追加されるので、折り返したいカラムに order: 2 を指定します。
.flex-items::before {
content: '';
order: 2;
width: 100%;
}
.flex-items__item:nth-child(n+6) {
order: 2;
}

