Having multi-field primary keys is not wrong but it does make joins more awkward and it will prevent you from using combo and list boxes to help you to pick values.
You will eventually run into problems as you try to build your interface so I would suggest using an autonumber as the PK to the table and then adding a unique index to enforce the business rule that the combination of Grade and Level must be unique. To change the tables, add an autonumber to the salary table. Name it SalaryID. Then add SalaryID as a long integer to the other table. Join the two tables on Grade and Level and update the Years in Service table with the SalaryID value. Once you are sure that values have been updated correctly, remove the three extraneous fields from the Years in Service table. You can pick up the three fields whenever you need them by using a join.
As arnel suggested, I would almost always use a query with a join. Domain functions run separate queries so they should be avoided inside other queries or in code loops. If you use a domain function in a query that has a thousand records, the query needs to run 1000 other queries. One for each row to get the answer from the DLookup(). The join is far more efficient.
Not sure why this popped up but it did and so I responded