попробую пояснить как то попроще что ли))
Вот вы запустили короутину в строке
StartCoroutine(ExecuteAfterTime());
оно тут же начнет её выполнять, и выполнит все вызовы внутри короутины пока не наткнется на какое нибудь "подождать", в вашем случае
yield return new WaitForSeconds(1);
наткнулось -> вернулось тут же в основной поток и продолжило выполнять
temp.transform.position = pointss[i]; и далее цикл.
и условно спустя "подождать", оно продолжит выполнять короутину (снова из основного потока заглянув в нее)
(на деле там конечно малость иначе, но для понимания сойдет)
void ChangePos(List<Vector2> pointss, GameObject temp)
{
for (int i=0; i<pointss.Count; i++)
{
StartCoroutine(ExecuteAfterTime());
Debug.Log("from FOR _"+i.ToString());
temp.transform.position = pointss[i];
}
}
IEnumerator ExecuteAfterTime()
{
yield return new WaitForSeconds(1);
Debug.Log("Arter 1 second");
}
попробуйте вот такой код и поймете, когда и что вызывается.
и что в общем то верно вам пояснили, что если хотите растянуть цикл во времени, то весь его в короутину запихать.