No to wszystko jasne. Ta funkcja rozumiem jest w pliku database.js, tak? Pokaz kod wywołujący ta funkcje.
Jeżeli zmienna records, to zmienna globalna, to będą w niej dane dopiero po pobraniu plików. Jeżeli wywołujesz getRecords w pliku script.js i później od razu próbujesz przeczytać wartość zmiennej records, to tam nic nie będzie. Będzie tam coś za pół sekundy, sekundę, albo dwie sekundy, ponieważ sam ajax jest asynchroniczny i dopiero za X czasu po wywołaniu tej metody w Twojej zmiennej się cos pojawi, bo dopiero za X czasu odpali się funkcja onreadystatechange. Musisz użyć Promise albo async/await (nie wiem ile przeglądarek to wspiera natywnie).
Jeszcze dla wyjaśnienia. W pliku database.js jest wszystko okej, bo czytasz zmienna records w czymś, co się nazywa callback (onreadystatechange). Ta funkcja się odpala dopiero jak żądanie się wykona. W pliku script.js prawdopodobnie próbujesz zrobić to synchronicznie. A typ object jest w dwóch miejscach, bo początkowa wartość to tablica - pusta, ale wciąż tablica - a tablica w js jest obiektem.
To trochę tak, jakbyś zamówił jedzenie i w pliku database.js czekasz cierpliwie aż Ci powiedzą, ze jest gotowe i dopiero jesz, a w pliku script.js próbujesz opędzlować talerz nie czekając na jedzenie.
Tutaj masz trochę lepiej i obszerniej wytłumaczone:
https://eloquentjavascript.net/11_async.html
A tutaj wspaniała seria explain like i’m five:
https://www.reddit.com/r/javascript/comments/5pxgvc/explain_javascript_promises_to_me_like_im_5/#ampf=undefined