Grep mainly looks for lines that contain a match for the given pattern. Depending on the pattern, it may or may not be possible to determine whether a line matches without looking at the whole line. With grep Match, this is possible, but with grep 'Match$', it isn't. With grep -o Match, grep could print Match as soon as it sees it, but with grep -E -o '(Match)+', if grep has read MatchMa, it doesn't know whether tch will follow or not.
Grep does not implement the special cases where it would be possible to write some output before seeing a whole line. (I think it doesn't implement any such special case, but I'm not completely sure: GNU grep has several modes depending on the pattern that behave somewhat differently.) It just reads one whole line before trying to match.
If there's a character that's never appears in matching text and that always (or at least often) appear between matches, transform this character into a newline. (Or into a null byte and use grep -z.)
while true; do printf "Match Unmatch"; sleep 1s; done | stdbuf -o0 tr ' ' '\n' | grep -o "Match"
Note the use of stdbuf -o0 to prevent tr from buffering its output. And if you pipe the output of grep, you'll need that for grep as well, or use grep --line-buffered. (--line-buffered buffers the output of grep; it has no impact on how grep reads input, and it's on by default when grep is printing to a terminal.)
     
    
grep --line-buffered "Match".