For a good understanding of session objects and the difference with token objects, the PKCS #11 Usage Guide is probably more helpful than the PKCS#11 Base specification. Section 2.3 (Logical view of a token) of the Usage Guide says: Objects are also classified according to their lifetime and visibility. “Token objects” are visible to all applications connected to the token that have sufficient permission, and remain on the token even after the “sessions” (connections between an application and the token) are closed and the token is removed from its slot. “Session objects” are more temporary: whenever a session is closed by any means, all session objects created by that session are automatically destroyed. In addition, session objects are only visible to the application which created them.
Also for more details on sessions and session objects, you may check the section 2.6 (Sessions). In particular, section 2.6.4 explains the differences in terms of permissions for session objects and token objects, depending on the session type. For instance, in a read-only session, you can still create/modify session objects, but not token objects.
As a developer, if you don't need any persistence of the object (beyond the session lifetime) or to make it visible to other applications, then it's usually safer and likely more efficient to use session objects; else you have to use token objects. Actually, the more efficient depends on the implementation in the end, because as Tim Robert mentions, the storage mechanism is implementation-specific (check the documentation of the hardware token and associated PKCS#11 library), not in the standard. So you may assume that most implementations use memory instead of persistent storage for session objects, and therefore they should be processed faster, but ultimately you would need a little benchmark on your particular hardware token to confirm that.
EDIT 2025-07-07
For example, there are certified PKCS#11 hardware implementations (e.g. some HSMs) that allow to store the session (and/or token) objects outside the hardware token, i.e. on the host of the PKCS#11 app/library (probably in RAM for session objects, but again, this is implementation-specific), and in this case, they use a key wrapping mechanism to protect the private/secret key objects from being exposed on the host; i.e. these keys are wrapped with a wrapping key inside the hardware token before going out to the host (or if a key hierarchy is used, only the root wrapping key needs to be inside the hardware token). Then the key is unwrapped inside the token when it is needed for a PKCS#11 crypto operation. So some PKCS#11 libraries for particular smartcards may do this as well, but this is vendor-specific (looking at the product documentation or implementation code of the PKCS#11 library for the smartcard might help).
Check also this answer: https://security.stackexchange.com/questions/117624/pkcs11-session-object-security