Killing all sessions for a user does NOT mean those sessions disappear immediately. So you will need to pool gv$session after the kill command to see when those sessions are cleaned up.
For example
SQL> conn demo/demo
Connected.
SQL> create table t as
2 select rownum x, rownum y, rownum z
3 from dual
4 connect by level <= 1000000;
Table created.
SQL> create index ix1 on t ( x );
Index created.
SQL> create index ix2 on t ( y );
Index created.
SQL> create index ix3 on t ( z );
Index created.
SQL> create index ix4 on t ( x,y );
Index created.
SQL> create index ix5 on t ( y,z );
Index created.
SQL> create index ix6 on t ( z,x );
Index created.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> delete from t;
1000000 rows deleted.
So I've deliberately loaded up a large workload of uncommitted changes here. Now I'm going to kill that session, which means all that work will need to be rolled back, which will take some time.
SQL> conn / as sysdba
Connected.
SQL> alter system kill session '258,64049';
System altered.
SQL> select sid, status, username from v$session where username = 'DEMO';
SID STATUS USERNAME
---------- -------- ---------------------------------------------
258 KILLED DEMO
You can see the session is killed, but still there, and hence:
SQL> drop user demo cascade;
drop user demo cascade
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
I wait a little longer, and eventually the session disappears and then:
SQL> drop user demo cascade;
User dropped.