This is because grep does not use shell-style wildcards, it uses regular expressions. The . means "match any character", and the * means "match one or more of the previous character". So .* means "match one or more of anything".
You asked for "cheese...jam...bread", not "cheese....bread....spoon" so of course it will not match since it cannot find 'jam' nor 'bread' in the order it expects. Alter the pattern "cheese.*jam.*bread" to "cheese.*bread.*spoon"