ob_start() è una cache, un buffer. Invece di sputare fuori l'output direttamente al client lo tiene in memoria e lo restituisce a blocchi di N byte dove N è il valore che tu hai specificato nel PHP ini.

Due considerazioni in merito all'approccio che stai seguendo:

1. meno mischi logica applicativa e vista meglio è. In altre parole, inserire il setcookie lì nel body è sintatticamente corretto ma tecnicamente errato. E' difficile da seguire (pensa ad un codice compleso), inutile poiché ti porta ad utilizzare decine di workaroud (vedi il buffer) per arrivare ad ottenere un risultato.
In genere, quando una cosa semplice mostra così tanti problemi... forse è perché stai scegliendo la strada sbagliata.

2. Limita l'uso del buffer solo se e quando necessario. In questo caso non lo è, rallenti solo l'elaborazione.