Если вызвать Add(1) внутри запускаемой горутины, планировщик может выполнить Wait() до того, как Add успеет выполниться - Wait увидит 0 и не будет ждать новую горутину. Add до запуска гарантирует, что счётчик увеличен до того, как кто-то вызовет Wait.
wg.Add(len(tasks))
for _, t := range tasks { go func(t T) { defer wg.Done(); t.Do() }(t) }
wg.Wait()