###Q1
To answer your Q1:
 > Q1: is there a way to perform command substitution inside awk?

Of course there is a way, from `man awk` :

 > command | getline [var]
 >     Run command piping the output either into $0 or var, as above, and RT.

So ( Watch the quoting !! ):

    find . | awk '/txt$/{"wc -l <" $NF " | cut -f1" | getline nl; print nl }'

Please note that the string built and therefore the command executed is 

    wc -l <file

To avoid the filename printing of `wc`.

Well, I avoided a needed file "close" for that command (safe for a couple of files, but technically incorrect). You actually need to do:

    find . | awk '/txt$/{
                           comm="wc -l <" $NF " | cut -f1"
                           comm | getline nl;
                           close (comm);
                           print nl 
                        }'

That works for older awk versions also.  
Remember to avoid the printing of a dot `.` with `find .`, that makes the code fail as a dot is a directory and wc can not use that. 

Or either, avoid the use of dot values:

    find . | awk '/txt$/ && $NF!="." {  comm="wc -l <" $NF " | cut -f1"
                                        comm | getline nl;
                                        close (comm);
                                        print nl 
                                     }'

You can convert that to a one-liner, but it will look quite ugly, Me thinks.