Node#child
is the fastest way to get the first child element.
However, if the node you're looking for is NOT the first, perhaps the 99th, then there is no faster way to select that node than to call children
and index into it.
You are correct in stating that it's expensive to build a NodeSet for all children if you only want the first one.
One limiting factor is that libxml2 (the XML library underlying Nokogiri) stores a node's children as a linked list. So you'll need to traverse the list (O(n)) to select the desired child node.
It would be feasible to write a method to simply return the nth child, without instantiating a NodeSet or even Ruby objects for all the other children. My advice would be to open a feature request, or send an email to the Nokogiri mailing list.