La spiegazione è nel fatto che, per quanto apparentemente simili, si tratta in realtà di due costruzioni diverse, come intuisci.
“Si mangiano gli spaghetti” è appunto un esempio del cosiddetto si passivante: è di fatto una costruzione passiva, ma non costruita con un ausiliare (come in “sono/vengono mangiati gli spaghetti”). Quindi, analogamente alle altre forme del passivo, il soggetto grammaticale è “gli spaghetti”, nonostante a compiere l'azione sia qualcun altro, non menzionato.
Questo caso rientra nella situazione più generale delle costruzioni anticausative. Semplificando, il senso è semplicemente che, mentre in quelle causative si specifica chi esercita l'azione (“l'autista ferma l'autobus”), in quelle anticausative o decausative no (“l'autobus si ferma”). Se vuoi approfondire, trovi qualcosa in questa tesi di dottorato.
Per inciso, l'uso attuale prevede che nel caso del si passivante
l’accordo è coerentemente dipendente dal soggetto: si sentono urli. Tuttavia, in toscano popolare, come in italiano antico, l’accordo al singolare (quindi di tipo impersonale) è diffuso, anche se è da considerarsi oggi substandard o molto letterario: si sente urli (“accordo”, Enciclopedia dell'italiano).
“Li si mangia”, detto sempre degli spaghetti, è invece una vera e propria costruzione impersonale, in cui il soggetto non è espresso, ma il “si” si riferisce ugualmente a chi compie l'azione. Come spiega la pagina dell'Enciclopedia dell'italiano dell'ultimo link,
Il si impersonale indica un partecipante umano, indefinito, dal riferimento generico (indeterminato o esistenziale [...]).
Nell’interpretazione generica il si denota un gruppo di persone a cui si applica una proprietà, intesa come caratteristica del gruppo. [...]
in questa casa si legge molto [si = «le persone che vivono in questa casa»]
ma sono possibili anche riferimenti specifici (“ieri si è bevuto molto a casa di Mario”).