Perhaps the multienum package could be an option:
\documentclass[12pt]{article}
\usepackage{amssymb} %for \blacksquare
\usepackage{multienum}
\newcommand{\rsqr}{\raisebox{0.4ex}{\tiny $\blacksquare$}}
\newlength\myindent
\newlength\mylen
\renewcommand{\itemxx}[2]{%
\setlength\mylen{\remainxx}
\addtolength\mylen{-\myindent}
\hskip\myindent
\parbox[t]{\labelwidth}{\hfill\labelenumi}%
\hskip\labelsep
\parbox[t]{0.5\mylen}{\raggedright #1}%
\hfill\parbox[t]{\labelwidth}{\hfill\labelenumi}%
\hskip\labelsep
\parbox[t]{0.5\mylen}{\raggedright #2}\smallskip}
\newenvironment{listable}[1][0cm]
{\begin{multienumerate}
\setlength\myindent{#1}
\renewcommand\labelenumi{\rsqr}
\setlength\itemsep{-.5\baselineskip}
}
{\end{multienumerate}}
\begin{document}
\begin{listable}
\mitemxx{Lots and lots of text, oh my!}{More and more text}
\mitemxx{word}{All work and no play makes Jack a dull boy}
\end{listable}
\begin{listable}[4em]
\mitemxx{Lots and lots of text, oh my!}{More and more text}
\mitemxx{word}{All work and no play makes Jack a dull boy}
\end{listable}
\end{document}
The optional argument of the listable
environment controls the indentation from the left margin (default value: 0cm).

Your problem is due to the fact that on one hand you use the enumitem
package but then you also define your own lists via the list
environment of LaTeX. The enumitem
package doesn't know about your new list and gets confused.
Basically what happens is that the following code in \enit@preset
makes the wrong choice:
\ifnum\@listdepth=\@ne
\enit@outerparindent\parindent
\else
\parindent\enit@outerparindent
\fi
The idea of this code is to save the outer \parindent
value in \enit@outerparindent
when we enter the first level of lists and if we enter a nested list reuse the saved value instead. Now unfortunately your new list doesn't know about this so nothing gets saved. But if the enumerate
is entered it is in fact already on level 2 and therefore \parindent
gets the current value of \enit@outerparindent
which is, of course, still zero.
So either you simply give listparindent
and explicit value when you call enumarate, e.g.
\begin{enumerate}[parsep=0pt,listparindent=15pt]
or, if you like this properly fixed you could set \enit@outerparindent
in your definition of exercises
if it exists (i.e., if enumitem
was loaded), e.g.,
\makeatletter
\newenvironment{exercises}%
{\begin{list}{\exitem}{%
\@ifundefined{enit@outerparindent}{}% if this command exists set it, otherwise do nothing
{\ifnum\@listdepth=\@ne
\enit@outerparindent\parindent
\else
\parindent\enit@outerparindent
\fi
}%
\usecounter{exercise}%
\small%
\setlength{\itemindent}{\exlabelwidth}%
\addtolength{\itemindent}{\labelsep}%
\setlength{\labelwidth}{\exlabelwidth}%
\addtolength{\labelwidth}{\exsymbolwidth}%
\addtolength{\labelwidth}{\exlabelsep}%
\setlength{\leftmargin}{0.0cm}%
\setlength{\itemsep}{0.0cm}%
\setlength{\parsep}{0.0cm}%
\setlength{\listparindent}{\parindent}%
}%
}%
{\end{list}}
\makeatother
Because of the @
signs you need \makeatletter ...\makeatother
.
Best Answer
The book by Leslie Lamport, LaTeX: a document preparation system (1994) has a figure like the one you asked for on page 113, which explains, among other things, that the vertical space at the bottom of a list is always the same as the space at the top. The latter depends on the circumstances, namely, on whether the list was or was not started in vertical mode.
This is the corresponding figure in “The LaTeX Companion”