For #outer height to be based on its content, and have #inner base its height on that, make both elements absolutely positioned.
More details can be found in the spec for the css height property, but essentially, #inner must ignore #outer height if #outer's height is auto, unless #outer is positioned absolutely. Then #inner height will be 0, unless #inner itself is positioned absolutely.
<style>
#outer {position:absolute; height:auto; width:200px; border: 1px solid red; }
#inner {position:absolute; height:100%; width:20px; border:1px solid black; }
</style>
<div id='outer'>
<div id='inner'>
</div>
text
</div>
However... By positioning #inner absolutely, a float setting will be ignored, so you will need still need to choose a width for #inner explicitly set it left:0 (or wherever), and specify a padding for #outer to fake the text wrapping I suspect you want.
<style>
#outer2{padding-left: 23px;
position:absolute; height:auto; width:200px; border: 1px solid red; }
#inner2{left:0;
position:absolute; height:100%; width:20px; border:1px solid black; }
</style>
<div id='outer2'>
<div id='inner2'>
</div>
text
</div>
I deleted my previous answer, as it was based on too many wrong assumptions about your goal.