ICU library は文字セット変換の機能を持っていて、ucnv.h の UConverter を使います。
この UConverter 実は callback 関数を登録できて、UTF-8 文字列からでも ASCII 文字セットに変換することができます。ちょうど Java での native2ascii のような動作をさせることもできます。
たとえば ICU に付属の uconv を使って次のようにします。
$ uconv -f UTF-8 -t ISO8859-1 --callback escape-java utf8.txt
\u30C6\u30B9\u30C8
utf8.txt の中には「テスト」と書かれていたので、\u30C6\u30B9\u30C8 という結果が返ってきています。escape-java の部分は [substitute, skip, stop, escape, escape-icu, escape-java, escape-c, escape-xml, escape-xml-hex, escape-xml-dec, escape-unicode] のどれかです。
で、こうやってなんとか情報劣化を救ったとしても、これをどうやって戻すかという問題が次は出てきます。戻す方法は ICU library 内部にあるはずだ、そしてそれは UConverter の近くにあるはずだ、と思ってました。callback は「困ったら呼ぶ」なので「戻らないかもな」と思う一方で、マニュアルの UCNV_ESCAPE_C の解説には TO_U_CALLBACK_ESCAPE という文字があるので「ひょっとして ucnv_toUChars() で機能するのか?」と思ったりしていました。
予想をガッチリ裏切られました。実はこれは UConverter を使ってはできません!
escape-java, escape-c の場合は u_unescape (ustring.h) でエスケープシーケンスを戻せます。
u_unescape の規則は次のとおり: (
http://icu-project.org/apiref/icu4c/ustring_8h.html#7aad56a2a6f7cbe3b2fb802a218d239b 
)
- \uhhhh の 4 hex digit 形式。h は [0-9A-Fa-f] の範囲
- \Uhhhhhhhh の 8 hex digit 形式。
- \xhh の 1-2 hex digit 形式。
- \x{h...} の 1-8 hex digit 形式。
- \ooo の 1-3 octal digit 形式。o は [0-7] の範囲。
- \cX の control-X 形式。X は 0x1F でマスクされた値。
- そして標準 ANSI C エスケープの形式。つまり \a, \b, \t, \n, \v, \f, \r, \e, \", \', \?, \\
- \ でエスケープされたものは、単にエスケープが解除される。
escape-java, escape-c を使う場合は、行きは ucnv_open("ISO8859-1",NULL) して、戻りは u_unescape() するのが良さそうです。
escape-xml, escape-xml-hex, escape-xml-dec については、XML に埋め込んでしまえば、XML パーサがデコードをやってくれるでしょう。
escape, escape-icu, escape-unicode は dump 以外の使い方がないような…。
プログラムで使う上では、結局 Java のほうがよく考えられていると思います。簡単な一例を挙げると「\uXXXX」という文字列自体を保存したい場合です。Java の native2ascii では \uuXXXX という形式に変換する一方で、ICU のやり方を通すと単に情報が失われます。