The reason that the spec says so is to provide a level of indirection between the JNDI and the actual resource. This is true for DataSources and other resources as well.
Let's understand the reason for this. The Bean Provider writes reusable components which can be deployed anywhere and by anyone. When he needs to do a JNDI lookup on a DataSource, he does not know the real JNDI name of the database let alone the real name of the database. So, he invents a JNDI name to use in his code.
However, he also declares the same fake JNDI name in the DD.
The Application Deployer will then map the fake JNDI name to the real JNDI name (let's call it CustDatabse) under which the DataSource is registered using a vendor-supplied tool. The System Administrator will then configure the database (let's say its real name is CustomerData) into the server and gives it a JNDI name.
So, the use of fake JNDI names and subsequent mapping to real names is fundamentally important to the objective of WODA (write once deploy anywhere).