Ваш вариант не решает проблему некорректного сокращения, а просто убирает его.
Предлагаю сделать так (у меня работает)
HTML:
{if $category->description}
<div class="cat_desc">
{if strlen($category->description) >120}
<div id="category_description_short">{$category->description|truncate:120}</div>
<div id="category_description_full" style="display:none">{$category->description}</div>
<a href="#" onclick="$('#category_description_short').hide(); $('#category_description_full').show(); $(this).hide(); return false;" class="lnk_more">{l s='More'}</a>
{else}
<p>{$category->description}</p>
{/if}
</div>
{/if}
Причина - некорректная обработка аттрибута style="display:none" внутри тега <p>.
А в теге <div> всё работает хорошо.
Почему? Пусть объяснят знатоки HTML...