It's because TRUNCATE is DDL rather than DML
From MSDN:
TRUNCATE TABLE
[ { database_name .[ schema_name ] . | schema_name . } ]
table_name
[ ; ]
Also, regarding permissions:
The minimum permission required is ALTER on table_name. TRUNCATE TABLE
permissions default to the table owner, members of the sysadmin fixed
server role, and the db_owner and db_ddladmin fixed database roles,
and are not transferable. However, you can incorporate the TRUNCATE
TABLE statement within a module, such as a stored procedure, and grant
appropriate permissions to the module using the EXECUTE AS clause.
Notice the db_ddladmin requirement. As DDL, the four-part naming isn't allowed. Compare it to Technet info on the FROM clause:
If the table or view exists in another database on the same instance
of SQL Server, use a fully qualified name in the form
database.schema.object_name.
If the table or view exists outside the instance of SQL Server, use a
four-part name in the form linked_server.catalog.schema.object. For
more information, see sp_addlinkedserver (Transact-SQL). A four-part
name that is constructed by using the OPENDATASOURCE function as the
server part of the name can also be used to specify the remote table
source. When OPENDATASOURCE is specified, database_name and
schema_name may not apply to all data sources and is subject to the
capabilities of the OLE DB provider that accesses the remote object.
Sources:
http://msdn.microsoft.com/en-us/library/ms177570.aspx
http://technet.microsoft.com/en-us/library/ms177634.aspx
Edit:
To answer your question on how to do it, write a stored procedure in the target database. Grant access to execute the procedure, and call truncate from the procedure.