I think fundamentally, the reason "pure functional" languages don't have object identity, is because object identity is typically a synonym for address identity or storage location identity, and pure functional languages don't have such a concept.
The reason functional languages don't have this concept is because they are primarily for the use of those whose background is mathematics and whose application of the computer will be primarily mathematical, and who as mathematicians usually don't have (and don't need to have) a strong systematic concept of storage. The compilers of such languages manage the use of local storage automatically in a way that the programmer can fail to know that such a function is even being performed.
What I mean by storage is the concept of data having a physical placement and organisation, and of the existence of operations that are designed to alter the physical placement of data (or alternatively put, operations that are designed to alter the data present in a physical place).
There is no assignment operator in conventional mathematics, in the sense of an operator that purely commands a value to be moved or copied from one place to another.
There is a tendency for mathematicians to think of values as abstract objects, that exist in no particular place (because in truth it exists as an idea in their minds), and whose occasional physical manifestations or representations can spring in and out of reality without much consideration. Two representations of the number 1, are still the same number 1.
Computer programmers however think of a value as being the setting of a field in storage. In a hypothetically static environment, the distinction may not seem obvious. It becomes more obvious when you are engaged in the process of making changes to physical storage in a machine or system that has moving parts and change - when you are engaged in programming how those changes are to be done.
Programmers do understand and use (on the appropriate occasions) the mathematical notion of values and value equality, but there is the possibility of additional comparisons which arise in programming, which is not just whether the values of two different variables are the same, but whether two references to storage locations are to the same location. The same values in different locations often mean different things, too.
When values arise from the same storage location with two aliases, the value in such a case is not just the same, but connected by means of a reference to a common physical place of storage, in the sense that alteration via one reference will change the value subsequently retrieved by the other reference because they are both working via the same storage location.
In most industrial programming languages, you see, a named variable is primarily an alias for a storage location, not an alias for a particular value or a algebraic placeholder which is later bound to a value.
These industrial languages are more popular because they proceed from conceptualisations appropriate to data processing, where the physical movement and placement of data, and the changing of data in particular places in response to ongoing events and control actions of all kinds, is an important aspect of what the machine is being programmed to do.
Summing it all up, pure functional languages are special purpose languages and therefore do not expose certain facilities and concepts of real physical computers, such as storage, and such as identity of storage locations.