I am a relatively new user of NodeBox but perhaps I can attempt an answer.
NodeBox is a functional language, so each node corresponds to a function with a single output. This is a core principle, so technically the answer to your question is no, a subnetwork can have only one output.
But in practice you can finesse this a bit. That one output can be any rendered node, so it's possible to output complex objects like shapes or zipMaps that can hold multiple pieces of information.
The trick to accessing those multiple pieces of information is the Lookup node. You can perform different lookups on the output of a subnetwork to recover multiple pieces of information.
In order to use a lookup you need to provide a key - and valid keys of node box objects are not well documented (to put it mildly). You can get a fighting chance of guessing at keys by using the new "Keys" node. Attach it the output of your subnetwork and you'll get a list of keys that will work with that object. Some valid lookup keys are not obvious from this list. For example, "bounds" is commonly available as a key, but by using dot notation you can access additional properties like "bounds.width" or "bounds.x". A little experimentation can sometimes uncover the incantation you need.
I show a nice example of this in response to the Recursion question you posted in the NodeBox 2 & 3 forum. You (or someone) closed the discussion so I had to start a new one, called "Recursive Pentagons".
The solution I provided includes a subnetwork that takes a parent pentagon as an input and produces a child pentagon as an output. To calculate the size and position of the child pentagon I had to access multiple pieces of information about the parent pentagon. I used a centroid node to recover the parent's position and used a "length" lookup to recover the parent's path length (all shapes in NodeBox are really just paths), which I then used to derive the parent's radius.
A more straightforward method of outputting multiple pieces of information is to create a zipMap. You can create an arbitrarily long list of key-value pairs by feeding a list of keys and a list of values into a ZipMap node. You can use Make Strings nodes to build both lists and then render the ZipMap mode when you create your subnetwork.
You can then recover all the pieces of information stored in your subnetwork by attaching it to different lookup nodes (one for each key you need). The drawback of this approach is that you may need your subnetwork to do something other than produce a zipMap. In that case all you can do is break up your code into multiple subnetworks, one to produce the zipMap and another to do stuff with it.
So it's rather tricky to encode multiple pieces of information into the single output of a subnetwork, but it can be done.
Hope this helps!
John