You don't need to pass `count` as a parameter as you can get it from `queries` Inside the method `RecursiveNestedOr` itself (also, rename parameter `query` as `queries`).  
  
Otherwise, your recursion looks fine to me. Here's how I'd "simplified" it, using LINQ (add `using System.Linq`):  
  

    public static string RecursiveNestedOr(IEnumerable<string> queries)
    {
        if (queries == null || queries.Count() == 0)
            return "";
    
       if (queries.Count() == 1)
           return queries.First();
    
        // Now queries.Count is at least 2
        return CAMLQueryBuilder.QueryOr(queries.Last(), RecursiveNestedOr(queries.Take(queries.Count() - 1)));
    }
  
  
EDIT:  
How to do it without recursion (code not tested):  
  

    public static string NestedOr(IEnumerable<string> queries)
    {
        if (queries == null || queries.Count() == 0)
            return "";
    
       if (queries.Count() == 1)
           return queries.First();
    
       string result = queries.First();
    
       // Now queries.Count is at least 2
    
       foreach(string query in queries.Skip(1))
       {
          result = QueryOr(result, query);
       }
    
        return result;
    }