It is certainly possible to read all of the data that you want in a single call to read. However, as you mentioned, then you will need to read into a buffer of size X*X. The numSampsPerChan parameter of DAQmxReadAnalogF64 will tell DAQmxReadAnalogF64 how many samples to transfer from the aquisition buffer to the buffer passed into read. In your case, if you pass X in for numSampsPerChan, then the read function should transfer that many points to the array you passed in, reguardless of the size of this array, and the mode of the acquisition. If you wish to read all of the data with a single read call, then you will need to specify numSampsPerChan as X*X, and pass read an array large enough for this amount of data. The end result would be the same as if you had called read X times, specifing numSampsPerChan as X, passing pointer into an array of size X*X which was incremented by X every time read was called. I hope that makes sense!
If you already know how big X is, it seems to me like it would make more sense to program a finite acquisition of size X*X, and perform a single read to retrieve the data. Is there a particular reason that this would not be an acceptable approach for your application? Because it seems to me that you are essentially going to be simulating this behavior by trying to read all data at once anyway.
Hope this helps,
Dan