Las variables no son más que enlaces a objetos. Tienes row enlazando a un objeto Vector<Float>, al meterlo en la lista lo que haces es crear otro enlace al mismo objeto al que enlaza row, es decir, tienes un objeto accesible mediante 2 enlaces (row y un elemento de la lista). Al hacer el row.clear(), estás haciendo el clear sobre el objeto enlazado por row, que es el mismo objeto que es parte de la lista. En tu caso estabas trabajando todo el tiempo con el mismo objeto por lo que terminabas la iteración con una lista de 2000 elementos y todos y cada uno de esos elementos eran un enlace al mismo objeto al que enlazaba row, objeto en el que habías usado el método clear().
No sé si "enlazar" es el término correcto para explicar esto, tal vez "apuntar" sería más concreto. En fin, creo que se entiende.
El método clear() elimina todos los objetos enlazados dentro del vector, pero el objeto sigue siendo el mismo. Sí, al crear el vector en el bucle lo que estás haciendo es crear un objeto nuevo en cada iteración, en vez de trabajar todo el tiempo con el mismo. Por eso la otra opción era meter en la lista una copia del objeto, es decir, row.clone().