Ok, this more or less works when put together in an org file:
#+BEGIN_SRC emacs-lisp :results none
(require 'cl)
(defun org-redisplay-ansi-source-blocks ()
"Refresh the display of ANSI text source blocks."
(interactive)
(org-element-map (org-element-parse-buffer) 'src-block
(lambda (src)
(when (equalp "ansi" (org-element-property :language src))
(let ((begin (org-element-property :begin src))
(end (org-element-property :end src)))
(ansi-color-apply-on-region begin end))))))
(add-to-list 'org-babel-after-execute-hook #'org-redisplay-ansi-source-blocks)
(org-babel-do-load-languages 'org-babel-load-languages '((shell . t)))
#+END_SRC
#+BEGIN_SRC sh :results output verbatim drawer :wrap src ansi
echo "\e[33mTest text\e[0m"
echo Styles: '\e[3mitalic\e[0m' '\e[1mbold\e[0m' '\e[4munderline\e[0m' '\e[1m\e[3mbolditalics\e[0m'
#+END_SRC
#+RESULTS:
#+BEGIN_src ansi
Test text
Styles: italic bold underline bolditalics
#+END_src
How it ends up looking like:

One issue I don't know how to fix yet is when the file is saved, all the ANSI information is lost.
org-babel-after-execute-hook
with appropriate precautions to apply it only to shell code blocks? Untested - and I don't know off the top of my head how to take those "appropriate precautions". – NickD Sep 10 '17 at 2:48org-babel-sh-evaluate
ororg-babel-execute:shell
– E Bro Sep 12 '17 at 2:54