Something along these lines would work:
\define TiddlerExpress(step:"0")
<$let
nth={{{ [list[$:/StoryList]allbefore:include<currentTiddler>count[]add[$step$]] }}}
target={{{ [list[$:/StoryList]nth<nth>] }}}
focus={{{ section.lox-tiddler:nth-child( [<nth>] n+1) button :and[join[]] }}}
refocus={{{ section.lox-tiddler:nth-child( [<nth>] n+1) a :and[join[]] }}}
>
<$action-sendmessage $message="tm-focus-selector" $param=<<focus>> preventScroll="true"/>
<$action-sendmessage $message="tm-focus-selector" $param=<<refocus>> preventScroll="true"/>
<$action-navigate $to=<<target>>/>
</$let>
\end
Text substitution is unfortunately still quite clumsy in filters. Personally I use a custom filter that allows syntax like:
focus={{{ [[section.lox-tiddler:nth-child($(nth)$n+1) button]printf[]] }}}
or
focus={{{ [[section.lox-tiddler:nth-child($0$n+1) button]printf<nth>] }}}
You can also use a macro like the .printf example that I provided in this thread to do text substitution for you.
Lastly, wikify should be avoided for performance reasons. However, using wikify within a macro that will be assigned as the actions of a triggering widget like $button is probably one of the areas in which the performance impact will be least felt. The actions are only parsed when they are invoked and thus refresh performance is less of a concern.