Actually, FAST DUAL might be a red herring. Forcing "normal" DUAL doesn't see to make a difference either.

Code:
SQL> SELECT package_name.get_a,
  2         package_name.get_b
  3  FROM  ( SELECT (CASE
  4                   WHEN 1 = 1 THEN
  5                     package_name.set_a_b (1, 2)
  6                   END)
  7          ,       dummy
  8           FROM   dual
  9           ORDER BY 1);

     GET_A      GET_B
---------- ----------


SQL>
SQL>
SQL> select * from table( dbms_xplan.display_cursor );

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
SQL_ID  79rukd61zu5sr, child number 0
-------------------------------------
SELECT package_name.get_a,        package_name.get_b FROM  ( SELECT
(CASE                  WHEN 1 = 1 THEN
package_name.set_a_b (1, 2)                  END)         ,       dummy
         FROM   dual          ORDER BY 1)

Plan hash value: 2367845099

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |
|   1 |  VIEW              |      |     1 |       |     3  (34)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------
Regards
Adrian