One of the main differences is that LLM-generated code can be tested. You can prove that it does what it's supposed to do — and if it fails the tests, you can tell the model to go back and fix it. So there's an objective criterion that can say "this is acceptable" vs "this is unacceptable". Now, it does rely on your tests being good, and not everyone has written those good tests. But it exists.
There are no objective criteria that can say "this text is good" or "this text is bad". Sure, spelling and grammar errors... but we're talking about writing style, "voice", and whether the text is easy for humans to read.
Now, there are plenty of problems with LLM-generated code that can't be solved by having good tests. Is it maintainable? Is it written in good coding style? Those are harder to quantify. But since LLMs are such good mimics, if you tell an LLM to add code to your existing project, then it's usually going to do a decent job of matching your coding style. The question of maintainability still rears its head; my personal experience is that the smaller the chunk of code the LLM generated for me, the more likely it is I can understand it fully and therefore maintain it in the future. An entire vibe-coded project? Good luck maintaining that. A 100-line class with five 20-line methods with names that make sense? Yeah, I can take that and maintain it in the future, even if the LLM tool goes away.
But mostly, the difference between the acceptance of LLM text or of LLM code, IMHO, boils down to "are there objective measures that I can use to accept this"? Code has to work, which is a much higher bar than text (which just has to have correct spelling and grammar), and therefore it's easier to get the LLM to spit out decent-ish code than decent-ish text.