I'm actually suggesting folding _api_path in there too.  Something like:

unsorted_children = if Chef::Config[:versioned_cookbooks]
                    rest.get_rest("#{api_path}/?num_versions=all").map |cookbook_name, value|
                      value['versions'].map do |cookbook_version|
                        CookbookDir.new "#{cookbook_name}-#{cookbook_version['version']}", self,
                                                  :versions_map  => value,
                                                  :version       => cookbook_version['version'],
                                                  :cookbook_name => cookbook_name
                      end
                    end
                  else
                    rest.get_rest(api_path).map |cookbook_name, value|
                      CookbookDir.new(cookbook_name, self, :versions_map => value, :cookbook_name => cookbook_name, :version => '_latest' )
                  end
@children = unsorted_children.flatten.sort_by { |c| c.name }

Either way, the indirection of the extra functions and such is making it harder to undersetand what's going down; a little explicitness could help here without losing DRY.