Yes, I had trouble with this when I was first learning Weblocks also.
WITH-HTML doesn't return a string; it writes HTML to the output stream. So calling it to supply the :CONTENT argument doesn't work. Similarly for RENDER-LINK.
But you can use functions as widgets; the function will be invoked during rendering, which is the right time to render HTML and links. So, for example:
(defun make-test-page ()
(make-instance 'widget :children
(list ... (lambda () (render-link ...)) ... )))
Oh, and you don't need to use DEFUN/CC unless you're doing something really complicated. I've written quite a substantial app without ever using it.
-- Scott