When you use the $(variable)$ construction inside a macro, it substitutes the text literally, without rendering.
So when the #*#@&* DO things render? And how do you control it? This is the kind of thing that can make you bang your head against the wall for hours.
Fortunately, we now have the <$wikify> widget. The <$wikify> widget renders the text it is given, allowing a more sane programming flow. So your code can now be written:
\define myStateTid() """$:/state/$(currentTiddler)$"""
\define buttontest2()
<$wikify name=hawaii text=<<myStateTid>>>
<$button set=<<hawaii>> setTo="edit">Press2</$button></$wikify>
\end
<<buttontest2>>
HTH
Mark