NSubstitute mock a void method with out parameters

out parameters are updated using their parameter position as an index. It's explained in the Returns documentation for NSubstitute. So, for your particular case, you are populating the second and third parameters, so you should be setting up your call like this:

customerDataAccess.When(x => x.GetCustomerWithAddresses(1, out customers, out addresses))
.Do(x =>
{
    x[1] = new List<Customer>() { new Customer() { CustomerId = 1, CustomerName = "John Doe" } };
    x[2] = new List<Address>() { new Address() { AddressId = 1, AddressLine1 = "123 Main St", City = "Atlanta" } };
});

For non-void methods the regular return syntax can be used:

 var haveWithAddresses = customerDataAccess.GetCustomerWithAddresses(1, out customers, out addresses)
               .Returns(callInfo => { 
                     callInfo[0] = new List<Customer>();
                     callInfo[1] = new List<Address>();
                     return true;
               });

With Void methods the When...Do syntax is correct.