Disclaimer: I don't know anything about output routines. This is just meant to be a very partial first step, and the code is a mess. The idea is to collect the margin notes and the body content in two vertical boxes, check at every paragraph whether we've reached the area of the page (converted to a dimension by dividing it by 100pt, to remain within TeX's max dimension). If so, shipout a horizontal box with two parts: a left column with only notes, (\vsplit to \vsize), and a right column with all the body text (hence we assume that this body text fits, in other words that there are at least 1/3 of notes, no check for that), then two columns of notes side by side.
Also, that's plain TeX. Well, I'm not really using much of plain, even.
\catcode`@=11
\newbox\marg@m@galley % contains all marginpars
\newbox\marg@b@galley % contains all of the body text
\newbox\marg@void@box % empty box.
\newdimen\marg@m@area % marginpar surface area
\newdimen\marg@b@area % body surface area
\newdimen\marg@t@area % m+b surface area
\newdimen\marg@p@area % page surface area
\newdimen\marg@m@prevdepth \global\marg@m@prevdepth=-1000pt
\newdimen\marg@b@prevdepth \global\marg@b@prevdepth=-1000pt
\newdimen\marg@notes@space % space between body and bottom notes.
\marg@notes@space=15pt
\def\marg@leavevmode{\begingroup\everypar={}\unhbox\marg@void@box\endgroup}
\def\marg@strip@pt{\expandafter\marg@rem@pt\the}
\begingroup\catcode`P=12\catcode`T=12
\lowercase{\endgroup\def\marg@rem@pt#1PT{#1}}
\def\marg@set@to@area#1#2{%
#1=.01\dp#2\relax
\advance#1by .01\ht#2\relax
#1=\marg@strip@pt#1\wd#2\relax}
\def\marg@conditionally@output{%
\marg@set@to@area\marg@m@area\marg@m@galley
\marg@set@to@area\marg@b@area\marg@b@galley
\marg@t@area\marg@m@area
\advance\marg@t@area by \marg@b@area
\marg@p@area=.0095\hsize
\marg@p@area=\marg@strip@pt\marg@p@area\vsize
\ifdim\marg@t@area>\marg@p@area
\marg@output
\fi}
\def\marg@output{%
\shipout\hbox to \hsize{%
\vbox to \vsize{\ifdim\ht\marg@m@galley>\vsize
\vsplit\marg@m@galley to \vsize\else\unvbox\marg@m@galley\fi\vfill}%
\hfill
\vbox to \vsize{%
\hsize\wd\marg@b@galley
\dimen@\vsize
\advance\dimen@ by -\ht\marg@b@galley
\advance\dimen@ by -\dp\marg@b@galley
\unvbox\marg@b@galley
\vskip\marg@notes@space
\hbox to \hsize {\vbox{\vsplit\marg@m@galley to \dimen@}%
\hfil\vbox{\vsplit\marg@m@galley to \dimen@}}%
\vfill
}%
}%
}
\def\marg@m@start{%
\setbox\marg@m@galley=\vbox\bgroup
\hsize=.30\hsize
\unvbox\marg@m@galley
\prevdepth=\marg@m@prevdepth
\let\@par\par
\def\par{\marg@m@stop\par\marg@m@start}}
\def\marg@m@stop{%
\@par
\global\marg@m@prevdepth=\prevdepth
\egroup
\marg@conditionally@output}
\def\marg@b@start{%
\setbox\marg@b@galley=\vbox\bgroup
\hsize=.65\hsize
\unvbox\marg@b@galley
\prevdepth=\marg@b@prevdepth
\let\@par\par
\def\par{\marg@b@stop\par\marg@b@start}}
\def\marg@b@stop{%
\@par
\global\marg@b@prevdepth=\prevdepth
\egroup
\marg@conditionally@output}
\long\def\marginpar#1{%
\marg@b@stop
\marg@m@start
#1%
\marg@m@stop
\marg@b@start
}
\def\lipsum@i{Lorem ipsum dolor sit amet, consectetuer
adipiscing elit. Ut purus elit, vestibulum ut, placerat ac,
adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu
libero, nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque. Pellentesque habitant morbi tristique
senectus et netus et malesuada fames ac turpis egestas. Mauris ut
leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
fringilla ultrices. Phasellus eu tellus sit amet tortor gravida
placerat. Integer sapien est, iaculis in, pretium quis, viverra ac,
nunc. Praesent eget sem vel leo ultrices bibendum. Aenean faucibus.
Morbi dolor nulla, malesuada eu, pulvinar at, mollis ac, nulla.
Curabitur auctor semper nulla. Donec varius orci eget risus. Duis
nibh mi, congue eu, accumsan eleifend, sagittis quis, diam. Duis
eget orci sit amet orci dignissim rutrum.\par}
\emergencystretch=.15\hsize
\marg@b@start
\lipsum@i
\lipsum@i
\marginpar{\lipsum@i\lipsum@i}
\lipsum@i
\marginpar{\lipsum@i\lipsum@i}
\lipsum@i
\marg@b@stop
\marg@output
\bye
%PDF-." from adobe reader, and i'm unable to look past the first page. (trying to read with current adobe reader plugin to current firefox on windows xp.) – barbara beeton Sep 10 '11 at 15:36